Escriba un programa o función (o conjunto de programas / funciones) para cifrar y descifrar datos con la siguiente especificación:
Cifrado
Calcule un hash XOR de la entrada haciendo XOR cada byte entre sí.
XOR cada byte de la entrada por este hash.
Desplaza el resultado cuatro bits hacia la izquierda.
Rellene el lado izquierdo con los primeros cuatro bits del hash XOR.
Rellene el lado derecho con los últimos cuatro bits del hash XOR.
Ejemplo
Entrada dada:
"G0lf"
(0x47306C66
)Calcule el hash XOR:
0x47 ^ 0x30 ^ 0x6C ^ 0x66 = 0x7D
XOR cada byte por hash:
0x3A4D111B
Resultado esperado (después de shift y pad):
"s¤Ñ\x11½"
(0x73A4D111BD
)
Reglas
Su programa / función puede ingresar / salir de cualquier tipo que tenga sentido en el idioma de golf que elija (String, Byte Array, etc.) siempre que la entrada / salida sean los bytes reales. Por ejemplo, no puede generar una cadena hexadecimal.
El cifrado y el descifrado se pueden separar en programas separados (la puntuación será el tamaño combinado) o en uno solo. Los métodos individuales pueden tomar un argumento sobre si debe cifrar o descifrar.
Se puede esperar que la entrada para el cifrado tenga al menos 1 byte de tamaño.
Se puede esperar que la entrada para el descifrado sea de al menos 2 bytes.
Los bytes no imprimibles no necesitan escapar en la salida.