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.
fuente
Respuestas:
CJam, 28 + 27 = 55 bytes
Para cada parte, presento un programa que espera que la entrada / salida tenga la forma de una matriz de enteros y otra que use una cadena. El recuento de bytes anterior es para la versión de matriz entera, pero la secuencia de comandos vinculada y la explicación son para la versión basada en cadenas (que puede usarse para probar el ejemplo dado en la pregunta).
Cifrado
Descifrado
Aquí hay un script de prueba que realiza un viaje de ida y vuelta completo e imprime el código cifrado antes de volver a descifrarlo.
Explicación
fuente
CJam, 36 + 34 = 70 bytes
Un enfoque un poco diferente usando formas binarias
Encriptador :
Cómo funciona:
Descifrador :
Cómo funciona:
Prueba el encriptador y desencriptador en línea
fuente
Pyth, 69 bytes
Esto combina cifrado y descifrado, simplemente agregue un
0
argumento para el cifrado o un1
para descifrado. La razón de esto es simple. Convertir cadenas en bits (o enteros de 4 bits) o al revés es realmente muy largo en Pyth. Al combinar las dos funciones en un solo programa, puedo ahorrar muchos bytes.Demostraciones en línea: cifrado y descifrado .
Explicación:
La primera parte convierte la entrada en una lista de enteros de 4 bits (cada carácter se convierte en 2 enteros de 4 bits) y los almacena
K
.La segunda parte determina los valores hash y los almacena
J
. Si losQ==0
calcula por xor, de lo contrario toma el primer y último valor deK
.La siguiente parte hace el xor usando los valores hash. Cuando
Q == 0
se realiza en la lista completaK
, de lo contrario solo en la listaK
sin el primer y último valor.Y la última parte se convierte de
K
nuevo en caracteres:fuente
Javascript ( ES6 ) 83 + 73 = 156
Ambas funciones toman la entrada como y salen una matriz de números para representar bytes.
Cifrar
858483Descifrar
7573Demostración (solo Firefox)
Usando cadenas 131 + 129 = 260
Y solo por diversión ... aquí hay algunas versiones que usan cadenas para entrada / salida en su lugar.
fuente