/ / XOR descriptografia de duas seqüências de texto simples - java, criptografia, binário, xor

Descriptografia XOR de duas seqüências de texto simples - java, criptografia, binário, xor

Fui designado na minha classe Java AP para descriptografar o seguinte: umzDlBF8aFix

com a seguinte chave: oE2dpffzEiFD

O único problema é que eu não sei como executar um XOR para descriptografá-los. Eu cheguei a ponto de transformá-los em binários:

chave: 101000 | 000100 | 110110 | 011101 | 101001 | 011111 | 110011 | 000100 | 100010 | 000101 | 000011

texto cifrado: 110110 | 100110 | 110011 | 100101 | 000001 | 111100 | 011010 | 000101 | 100011 | 110001

mas não sei o que fazer com isso. Se você pudesse me ajudar com isso, seria ótimo! O código seria bom também, mas não necessário.

Graças a um milhão!

Respostas:

0 para resposta № 1

Você não precisa transformá-los em binários. O XOR é uma operação bit a bit, para que você possa XOR dois bytes juntos e será como XOR cada bit de um byte com o bit correspondente do outro byte.

Basta escrever um loop de zero até (e excluindo)o comprimento da cifra, na qual você lê cada caractere da cifra, faça XOR com o caractere correspondente da chave e anexe o resultado a um StringBuilder. Então invoque .toString() no StringBuilder para obter seu resultado.

Se o seu compilador reclamar que não pode caracteres XOR, faça a conversão de cada char para um byte, execute o XOR entre os bytes e depois converta o resultado em um char.

o String classe tem um charAt() método que permite obter um personagem de umíndice específico na sequência. Como alternativa, você pode começar obtendo o conteúdo de cada sequência como uma matriz de caracteres. (Existe outra função para isso.)

Como bônus, você pode fazê-lo para que a chavenão precisa ter o mesmo comprimento que a cifra. Você pode manter um índice separado, endereçando os caracteres da cifra e, quando esse índice atingir o comprimento da cifra, você poderá defini-lo novamente como zero, começando a ler a cifra desde o início.


0 para resposta № 2

O operador XOR tem a propriedade que T XOR KXOR K == T, portanto, se você deseja criptografar um texto sem formatação T com uma chave K, aplica a operação C = T XOR K e, para descriptografar o texto, basta aplicar a mesma operação novamente (T = C XOR K). Você pode aplicar a operação XOR a todos os bytes no texto sem formatação usando um loop for ou um mapa de programação funcional.

EDIT: caso você precise, o operador XOR nas linguagens de programação é representado pelo caractere "^", então A ^ B significa A XOR B.

EDIT2: prova simples de que T XOR K XOR K == T, apenas para que você não precise aceitá-lo como se fosse mágica:

  • K XOR K é claramente igual a 0
  • T XOR 0 é claramente igual a T
  • Como o operador XOR é associativo juntamente com números binários, podemos escrever T XOR K XOR K como T XOR (K XOR K) == T XOR 0 == T

0 para resposta № 3

Como outros observaram, "xor" é um maravilhosomecanismo de criptografia, porque a criptografia e a descriptografia são exatamente a mesma operação. Se você usar todas as partes da chave apenas uma vez, terá o algoritmo de criptografia mais seguro possível.

Se você reutilizar qualquer parte da chave, ela se transforma em um dos piores mecanismos de criptografia, pois facilita a quebra.

O problema que você tem aqui é - como você vaidos caracteres para o valor que você deseja criptografar. Você pode pegar os valores dos caracteres Unicode, mas obtém resultados falsos com o texto cifrado e a chave. O problema ao usar o Unicode como é também é que você pode obter caracteres não imprimíveis após a criptografia / descriptografia, o que normalmente não é um problema, mas em exemplos de livros didáticos, é difícil imprimir caracteres não imprimíveis.

Para descriptografar seu texto, assumi que a tradução de caracteres funciona assim.

  • A - Z => 0 - 25
  • a - z => 26 - 51
  • 0 - 9 => 52 - 61

(Eu não precisava adivinhar o que seria 62/63, mas espaço e ponto seriam boas suposições).

Usando essa suposição e xor, eu pego seu texto cifrado umzDlBF8aFix e sua chave oE2dpffzEiFD e acabar com o texto simples GiFeMeaPenny.

Como isso é legível em inglês - "Me dê um centavo"- parece que as suposições acima são plausíveis.