XOR criptografa seus programas com a fonte de outros programas

24

Escreva dois programas para que, quando os bytes de seu código-fonte estiverem XOR-d juntos, produza um terceiro programa válido, tudo no mesmo idioma. O comprimento de cada um dos três programas em bytes deve ser idêntico.

O primeiro programa deve sair A. O segundo programa deve sair B. O terceiro programa deve sair C.

Uma nova linha é opcional, mas se uma gera uma nova linha, as outras devem também.

Se você usar qualquer sinalizador de linha de comando, deverá usar os mesmos para cada programa, ou seja, todos os três programas deverão ser executados da mesma maneira. Se você estiver usando uma linguagem como PHP que tradicionalmente começa com a mesma combinação de caracteres, por exemplo, <?mas existe uma opção de linha de comando que elimina esses caracteres que você pode usar, ou seja, o PHP deve ser executado apenas a partir da linha de comando.

Nenhuma entrada é permitida. Cada programa deve ser independente.

Se o seu programa estiver totalmente escrito em ASCII, as tabelas a seguir podem ajudar:

Codes 0x20 - 0x3F
 !"#$%&'()*+,-./
0123456789:;<=>?

Codes 0x40 - 0x5F
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_

Codes 0x60 - 0x7E
`abcdefghijklmno
pqrstuvwxyz{|}~

EDITAR

O uso de caracteres não imprimíveis é permitido, pois eu não o proibi expressamente originalmente. No entanto, se você quiser publicar uma versão que use apenas caracteres imprimíveis, seria ótimo! (A pontuação é a mais curta.) O "fator inteligente" do uso de códigos de controle está um pouco desgastado agora ...

EDIT FIM

XOR ao inserir dois códigos do mesmo bloco produzirá um código menor que 0x20 que, portanto, não é um código ASCII imprimível válido, por exemplo, 0x41 ( A) XOR 0x5A ( Z) = 0x1B. O XOR com dois códigos de blocos diferentes produzirá um código do terceiro bloco, por exemplo, 0x61 ( a) XOR 0x54 ( T) = 0x35 ( 5).

    |  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_
--- + --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
 @` |  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_
!Aa | !Aa  @` #Cc "Bb %Ee $Dd 'Gg &Ff )Ii (Hh +Kk *Jj -Mm ,Ll /Oo .Nn 1Qq 0Pp 3Ss 2Rr 5Uu 4Tt 7Ww 6Vv 9Yy 8Xx ;[{ :Zz =]} <\| ?_ >^~
"Bb | "Bb #Cc  @` !Aa &Ff 'Gg $Dd %Ee *Jj +Kk (Hh )Ii .Nn /Oo ,Ll -Mm 2Rr 3Ss 0Pp 1Qq 6Vv 7Ww 4Tt 5Uu :Zz ;[{ 8Xx 9Yy >^~ ?_ <\| =]}
#Cc | #Cc "Bb !Aa  @` 'Gg &Ff %Ee $Dd +Kk *Jj )Ii (Hh /Oo .Nn -Mm ,Ll 3Ss 2Rr 1Qq 0Pp 7Ww 6Vv 5Uu 4Tt ;[{ :Zz 9Yy 8Xx ?_ >^~ =]} <\|
$Dd | $Dd %Ee &Ff 'Gg  @` !Aa "Bb #Cc ,Ll -Mm .Nn /Oo (Hh )Ii *Jj +Kk 4Tt 5Uu 6Vv 7Ww 0Pp 1Qq 2Rr 3Ss <\| =]} >^~ ?_ 8Xx 9Yy :Zz ;[{
%Ee | %Ee $Dd 'Gg &Ff !Aa  @` #Cc "Bb -Mm ,Ll /Oo .Nn )Ii (Hh +Kk *Jj 5Uu 4Tt 7Ww 6Vv 1Qq 0Pp 3Ss 2Rr =]} <\| ?_ >^~ 9Yy 8Xx ;[{ :Zz
&Ff | &Ff 'Gg $Dd %Ee "Bb #Cc  @` !Aa .Nn /Oo ,Ll -Mm *Jj +Kk (Hh )Ii 6Vv 7Ww 4Tt 5Uu 2Rr 3Ss 0Pp 1Qq >^~ ?_ <\| =]} :Zz ;[{ 8Xx 9Yy
'Gg | 'Gg &Ff %Ee $Dd #Cc "Bb !Aa  @` /Oo .Nn -Mm ,Ll +Kk *Jj )Ii (Hh 7Ww 6Vv 5Uu 4Tt 3Ss 2Rr 1Qq 0Pp ?_ >^~ =]} <\| ;[{ :Zz 9Yy 8Xx
(Hh | (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_ 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww
)Ii | )Ii (Hh +Kk *Jj -Mm ,Ll /Oo .Nn !Aa  @` #Cc "Bb %Ee $Dd 'Gg &Ff 9Yy 8Xx ;[{ :Zz =]} <\| ?_ >^~ 1Qq 0Pp 3Ss 2Rr 5Uu 4Tt 7Ww 6Vv
*Jj | *Jj +Kk (Hh )Ii .Nn /Oo ,Ll -Mm "Bb #Cc  @` !Aa &Ff 'Gg $Dd %Ee :Zz ;[{ 8Xx 9Yy >^~ ?_ <\| =]} 2Rr 3Ss 0Pp 1Qq 6Vv 7Ww 4Tt 5Uu
+Kk | +Kk *Jj )Ii (Hh /Oo .Nn -Mm ,Ll #Cc "Bb !Aa  @` 'Gg &Ff %Ee $Dd ;[{ :Zz 9Yy 8Xx ?_ >^~ =]} <\| 3Ss 2Rr 1Qq 0Pp 7Ww 6Vv 5Uu 4Tt
,Ll | ,Ll -Mm .Nn /Oo (Hh )Ii *Jj +Kk $Dd %Ee &Ff 'Gg  @` !Aa "Bb #Cc <\| =]} >^~ ?_ 8Xx 9Yy :Zz ;[{ 4Tt 5Uu 6Vv 7Ww 0Pp 1Qq 2Rr 3Ss
-Mm | -Mm ,Ll /Oo .Nn )Ii (Hh +Kk *Jj %Ee $Dd 'Gg &Ff !Aa  @` #Cc "Bb =]} <\| ?_ >^~ 9Yy 8Xx ;[{ :Zz 5Uu 4Tt 7Ww 6Vv 1Qq 0Pp 3Ss 2Rr
.Nn | .Nn /Oo ,Ll -Mm *Jj +Kk (Hh )Ii &Ff 'Gg $Dd %Ee "Bb #Cc  @` !Aa >^~ ?_ <\| =]} :Zz ;[{ 8Xx 9Yy 6Vv 7Ww 4Tt 5Uu 2Rr 3Ss 0Pp 1Qq
/Oo | /Oo .Nn -Mm ,Ll +Kk *Jj )Ii (Hh 'Gg &Ff %Ee $Dd #Cc "Bb !Aa  @` ?_ >^~ =]} <\| ;[{ :Zz 9Yy 8Xx 7Ww 6Vv 5Uu 4Tt 3Ss 2Rr 1Qq 0Pp
0Pp | 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo
1Qq | 1Qq 0Pp 3Ss 2Rr 5Uu 4Tt 7Ww 6Vv 9Yy 8Xx ;[{ :Zz =]} <\| ?_ >^~ !Aa  @` #Cc "Bb %Ee $Dd 'Gg &Ff )Ii (Hh +Kk *Jj -Mm ,Ll /Oo .Nn
2Rr | 2Rr 3Ss 0Pp 1Qq 6Vv 7Ww 4Tt 5Uu :Zz ;[{ 8Xx 9Yy >^~ ?_ <\| =]} "Bb #Cc  @` !Aa &Ff 'Gg $Dd %Ee *Jj +Kk (Hh )Ii .Nn /Oo ,Ll -Mm
3Ss | 3Ss 2Rr 1Qq 0Pp 7Ww 6Vv 5Uu 4Tt ;[{ :Zz 9Yy 8Xx ?_ >^~ =]} <\| #Cc "Bb !Aa  @` 'Gg &Ff %Ee $Dd +Kk *Jj )Ii (Hh /Oo .Nn -Mm ,Ll
4Tt | 4Tt 5Uu 6Vv 7Ww 0Pp 1Qq 2Rr 3Ss <\| =]} >^~ ?_ 8Xx 9Yy :Zz ;[{ $Dd %Ee &Ff 'Gg  @` !Aa "Bb #Cc ,Ll -Mm .Nn /Oo (Hh )Ii *Jj +Kk
5Uu | 5Uu 4Tt 7Ww 6Vv 1Qq 0Pp 3Ss 2Rr =]} <\| ?_ >^~ 9Yy 8Xx ;[{ :Zz %Ee $Dd 'Gg &Ff !Aa  @` #Cc "Bb -Mm ,Ll /Oo .Nn )Ii (Hh +Kk *Jj
6Vv | 6Vv 7Ww 4Tt 5Uu 2Rr 3Ss 0Pp 1Qq >^~ ?_ <\| =]} :Zz ;[{ 8Xx 9Yy &Ff 'Gg $Dd %Ee "Bb #Cc  @` !Aa .Nn /Oo ,Ll -Mm *Jj +Kk (Hh )Ii
7Ww | 7Ww 6Vv 5Uu 4Tt 3Ss 2Rr 1Qq 0Pp ?_ >^~ =]} <\| ;[{ :Zz 9Yy 8Xx 'Gg &Ff %Ee $Dd #Cc "Bb !Aa  @` /Oo .Nn -Mm ,Ll +Kk *Jj )Ii (Hh
8Xx | 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_ 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg
9Yy | 9Yy 8Xx ;[{ :Zz =]} <\| ?_ >^~ 1Qq 0Pp 3Ss 2Rr 5Uu 4Tt 7Ww 6Vv )Ii (Hh +Kk *Jj -Mm ,Ll /Oo .Nn !Aa  @` #Cc "Bb %Ee $Dd 'Gg &Ff
:Zz | :Zz ;[{ 8Xx 9Yy >^~ ?_ <\| =]} 2Rr 3Ss 0Pp 1Qq 6Vv 7Ww 4Tt 5Uu *Jj +Kk (Hh )Ii .Nn /Oo ,Ll -Mm "Bb #Cc  @` !Aa &Ff 'Gg $Dd %Ee
;[{ | ;[{ :Zz 9Yy 8Xx ?_ >^~ =]} <\| 3Ss 2Rr 1Qq 0Pp 7Ww 6Vv 5Uu 4Tt +Kk *Jj )Ii (Hh /Oo .Nn -Mm ,Ll #Cc "Bb !Aa  @` 'Gg &Ff %Ee $Dd
<\| | <\| =]} >^~ ?_ 8Xx 9Yy :Zz ;[{ 4Tt 5Uu 6Vv 7Ww 0Pp 1Qq 2Rr 3Ss ,Ll -Mm .Nn /Oo (Hh )Ii *Jj +Kk $Dd %Ee &Ff 'Gg  @` !Aa "Bb #Cc
=]} | =]} <\| ?_ >^~ 9Yy 8Xx ;[{ :Zz 5Uu 4Tt 7Ww 6Vv 1Qq 0Pp 3Ss 2Rr -Mm ,Ll /Oo .Nn )Ii (Hh +Kk *Jj %Ee $Dd 'Gg &Ff !Aa  @` #Cc "Bb
>^~ | >^~ ?_ <\| =]} :Zz ;[{ 8Xx 9Yy 6Vv 7Ww 4Tt 5Uu 2Rr 3Ss 0Pp 1Qq .Nn /Oo ,Ll -Mm *Jj +Kk (Hh )Ii &Ff 'Gg $Dd %Ee "Bb #Cc  @` !Aa
?_ | ?_ >^~ =]} <\| ;[{ :Zz 9Yy 8Xx 7Ww 6Vv 5Uu 4Tt 3Ss 2Rr 1Qq 0Pp /Oo .Nn -Mm ,Ll +Kk *Jj )Ii (Hh 'Gg &Ff %Ee $Dd #Cc "Bb !Aa  @`

Procure dois caracteres de colunas diferentes e escolha o caractere na interseção que está na outra coluna, por exemplo, Be e: "BbXOR %Eeé 'Gg. Bé segunda coluna e eé a terceira coluna de modo a escolher o carácter da primeira coluna no 'Gg: '.

Fonte de exemplo:

 Ld+|?dpHs'-,pUe    (Program 1)
~bWn=n5Xe!t_G($3    (Program 2)
^.3EAQQ(-RSrkXqV    (Program 3)

Observe que em cada coluna pode haver apenas um dígito, uma letra maiúscula e uma letra minúscula. Para cada coluna, você pode usar qualquer caractere que desejar no primeiro programa e escolher 64 caracteres no segundo programa, mas apenas um caractere possível no terceiro programa. 0x7F não é válido em nenhum lugar.

Se você usa Unicode, depende de você validar o XOR-ing e deve dizer como ele é codificado, por exemplo, UTF-8, UTF-16, etc. Cada arquivo deve usar a mesma codificação.

Pontuação: duração de um programa. Menos bytes ganham!

CJ Dennis
fonte

Respostas:

13

GolfScript, 6 bytes

UMA

A'AA'|

B

cdc"B"

C

"C"ce^

|e ^são setwise ou e xor com a sequência de entrada vazia, o que não faria nada além de remover duplicatas na sequência.

Versão original (com caracteres não imprimíveis)

UMA

Xz'A'v

B

z9\x05"B"

C

"C"ceT

O GolfScript ignora as coisas indefinidas e os três programas são justos 'A' "B" "C".

jimmy23013
fonte
12

Javascript, 23 bytes

Programa A:

alert(' A '[~-~~2],'B')

Programa B:

alert(FL$RSsYnYW1f='B')

Programa C:

\0\0\0\0\0\0alert('C')\0;\0\0\03\0\0

Você pode testar a conversão com a seguinte função:

function xorString(a, b) {
  b = b || '';
  var length = Math.max(a.length, b.length);
  var chars = a.split('').map(function(charA, i) {
    var charB = b[i] || ' ';
    return String.fromCharCode(charA.charCodeAt(0) ^ charB.charCodeAt(0));
  });

  return chars.join('');
}
George Reith
fonte
Agradável!!! Você pode incluir um snippet de pilha mostrando isso.
Ismael Miguel
3

PHP, 15 + 1 bytes

Este foi fácil REALMENTE mais difícil do que o esperado, mas divertido!
Infelizmente, esta é a terceira reescrita devido a respostas inválidas.

Desta vez, ele deve ser executado no console (usando o parâmetro -r).

Programa A:

echo A;E925Z9A;

Programa B:

echo B; zzzzzz;

Resultado do XORing:

\0\0\0\0\0\3\0eCHO C;\0 //base 64: AAAAAAADAGVDSE8gQzsA

Despejo hexagonal:

   |00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|      TEXT      
--------------------------------------------------------------------
00 |00|00|00|00|00|03|00|65|43|48|4F|20|43|3B|00|  |.......eCHO C;.
====================================================================

O PHP lançará avisos sobre ter os caracteres \0e \3antes do eco, mas isso é ignorável.
São apenas avisos!
Ainda funciona e gera a resposta certa!


Tente executar isso no seu console:

php -r "@eval('echo B; zzzzzz;' ^ 'echo A;E925Z9A;');"

Se não puder, tente um destes:

Se você ainda não pode, execute o código você mesmo:

<?php

error_reporting( 0 );

$program_a = 'echo A;E925Z9A;';

$program_b = 'echo B; zzzzzz;';

eval( $program_a );

eval( $program_b );

eval( $program_c = $program_a ^ $program_b );

echo PHP_EOL, 'a ^ b = ';

var_dump( $program_c );

Código antigo, inválido:

Programa A:

<?=A;zzzzz;

Programa B:

<?=B;FEG9A;

Resultado do XORing:

\0\0\0\0<?=C;\0 //base64: AAAAAwA8Pz1DOwA=
Ismael Miguel
fonte
Na verdade, não consigo digitar \x00no meu console, mas substituí-los por \x03obras e \x00dentro do próprio PHP no meu servidor ainda é executado, então estou assumindo que sua resposta é válida agora! Eu também tive que usar um sinalizador para suprimir todos os erros: php -d error_reporting=0 -r "^C^C^C^C^C^CeCHO C;^C"Saídas C. Redirecionar o stderr ( 2>no Windows) não suprimiu todos os erros da saída.
CJ Dennis
Seu programa no console do Windows: "♥ eCHO C;"!
CJ Dennis
Os avisos do @CJDennis sempre são desconsiderados. Se fosse um erro fatal, seria pior. Mas acho estranho que isso ocorra quando XORing. Mas talvez seja por causa \3disso, que aparece como o clube dos corações. Mas você quer que eu adicione a -dbandeira à contagem?
Ismael Miguel
Como você não está vencendo o código GolfScript, não se preocupe. Se você encontrar uma versão de 6 bytes, terei que reconsiderar! Mas eu tive que trabalhar muito sem reconfigurar meu arquivo php.ini para que ele funcionasse corretamente! Gostei da maneira como o Windows transformou o \x03coração! Windows ♥ PHP!
CJ Dennis
11
Sim, o @conseguiu suprimir todos os erros!
CJ Dennis
3

Pip, 4 bytes

Como o user23013 está usando ASCII que não imprime no GolfScript, achei que poderia fazer o mesmo no Pip . Requer redirecionamento stderr, mas tudo bem , certo?

UMA

??'A

onde os dois ?s representam o caractere ASCII 0.

B

'C'B

C

'C??

onde os dois ?s representam caracteres ASCII 0 e 3, respectivamente.

Coloque cada programa em um arquivo ( A.pippor exemplo). No Linux, faça:

./pip.py A.pip 2>/dev/null

No Windows:

pip.py A.pip 2>nul

Se a saída de erro for verbal, aqui está uma solução de 5 bytes em ASCII imprimível:

pAa'A
 f"B"
P'Cec
DLosc
fonte
Sim, são permitidos o redirecionamento de stderr (por mais feio que seja!) E o uso de caracteres não imprimíveis. Também agradeço por postar uma versão totalmente imprimível!
CJ Dennis
2

Microscript , 8 bytes cada

UMA: 'APhgap)

B: 'BPh@" A

C: <0><3><0><0>'CPh

SuperJedi224
fonte
Eu não sabia que tantas línguas perdoam muito os códigos de controle na fonte. Dê uma olhada nas outras respostas, algumas das quais usam códigos que não são de impressão. Sinta-se livre para fazer o mesmo!
CJ Dennis
Eu pensei que ele disse para não usar ASCII que não imprime, mas posso estar errado. EDIT: E agora vejo que você mudou. Tudo bem, vou ver o que posso fazer.
SuperJedi224
11
Isso não deveria ser <0><3><0><0>...?
CJ Dennis
Você está certo. Obrigado por apontar isso.
SuperJedi224
2

Python, 19 15 14 bytes

a.py

00000000  70 72 69 6e 00 28 32 50  69 0a 74 22 41 22        |prin.(2Pi.t"A"|

b.py

00000000  70 72 69 6e 74 22 42 22  00 64 00 00 02 00        |print"B".d....|

c.py

00000000  00 00 00 00 74 0a 70 72  69 6e 74 22 43 22        |....t.print"C"|

Eu vim com essa solução quando notei que o python (2.7.6 no Ubuntu 14.04) depois de ver um caractere NUL ignorará o restante dessa linha.

Encurtado em 1 bytes quando percebi que o espaço após a impressão não era necessário. E encurtado em mais 4 bytes quando percebi que o caractere NUL também fazia com que a nova linha fosse ignorada, para que eu pudesse usá-lo para quebrar linhas no meio de uma palavra-chave.

Kasperd
fonte
0

Chip , 8 bytes

Todos exigem a bandeira -w.

Programa A

a*gt*...

( .é o caractere nulo \x00)

Programa B

...*gb*t

( .é o caractere nulo \x00)

Programa C

a*g^Mb*t

Ambos A e B produzem três avisos cada (por exemplo: 1:6 WARN: '' (0) is not a valid character :), mas eles podem ser ignorados com segurança desde que eles sigam para o stderr. Os elementos ^e Msão válidos, mas não fazem nada aqui.

Tenho certeza de que isso é o melhor que pode ser feito com os não-imprimíveis permitidos. Não tenho certeza se esta prova está completa, mas aqui vai:

Um requer a, g, t, e de alguma forma para ativar esses elementos (são necessários um mínimo de dois símbolos para isso, e *é a opção mais simples aqui). Do mesmo modo,
B requer b, g, t, e dois *s, e
C requer a, b, g, t, e dois* s.

Se C emprestar seus símbolos diretamente de A e B, haverá duas letras e dois *s que não serão reclamados. (Na minha implementação, A te B g). Esses quatro elementos podem ser sobrepostos para que sejam mutilados em C (produzindo ^e M, neste caso). Agora temos esses dois elementos mutilados, mais os seis elementos necessários acima (C requer 6, os outros apenas 5, mas precisamos de max () aqui), para um total de 8 elementos.


Lasca (sem aviso), 10 bytes

Todos exigem as bandeiras -wo .

Programa A

a*HH^t*Gg 

(existe um espaço à direita)

Programa B

KKb*t*^g G

Programa C

*a*b*^t Gg

Provavelmente, é o melhor que podemos fazer no ASCII imprimível, da seguinte forma: Os três programas, combinados, precisam de um total de 2 as, 2 bs, 3 gs e 3 ts. Como nenhum desses personagens pode passar para outro, precisamos de 2+2+3+3 = 10posições separadas.

Phlarx
fonte