Escreva um programa ou função (ou conjunto de programas / funções) para criptografar e descriptografar dados, de acordo com a seguinte especificação:
Criptografia
Calcule um hash XOR da entrada XOR-ing cada byte um com o outro.
XOR cada byte da entrada por esse hash.
Mude o resultado quatro bits para a esquerda.
Preencher o lado esquerdo com os quatro primeiros bits do hash XOR.
Preencher o lado direito com os últimos quatro bits do hash XOR.
Exemplo
Dados fornecidos:
"G0lf"
(0x47306C66
)Calcular o hash XOR:
0x47 ^ 0x30 ^ 0x6C ^ 0x66 = 0x7D
XOR cada byte por hash:
0x3A4D111B
Resultado esperado (após turno e bloco):
"s¤Ñ\x11½"
(0x73A4D111BD
)
Regras
Seu programa / função pode entrar / sair de qualquer tipo que faça sentido no idioma de sua escolha (String, Byte Array, etc) , desde que a entrada / saída sejam os bytes reais. Por exemplo, você não pode emitir uma seqüência hexidecimal.
Criptografia e descriptografia podem ser separadas em programas separados (a pontuação será o tamanho combinado) ou em um único. Métodos únicos podem usar um argumento para criptografar ou descriptografar.
Pode-se esperar que a entrada para criptografia tenha pelo menos 1 byte de tamanho.
Pode-se esperar que a entrada para descriptografia seja de pelo menos 2 bytes.
Bytes não imprimíveis não precisam ser escapados na saída.