En los años 80, escribí un programa de cifrado para algunos archivos de datos pequeños (10-20 K). Es puramente basado en EOR, por lo tanto, tanto el cifrado como el descifrado son idénticos y pueden alternar de un lado a otro infinitamente.
- El usuario ingresa una contraseña ASCII de 8 bytes de largo
- Se establecen cuatro punteros de memoria de 16 bits a partir de los 8 bytes de contraseña
-
Los datos cifrados son EOR-ed con datos de kernel de ROM secuenciales
-
Sin embargo, si la contraseña no es correcta al descifrar, los datos descifrados serán basura
Pseudo-código (transpuesto de la versión original en lenguaje de máquina):
*a = password[0] | password[1] << 8;
*b = password[2] | password[3] << 8;
*c = password[4] | password[5] << 8;
*d = password[6] | password[7] << 8;
for(i=0; i<strlen(data); i++) {
n = i & 0xff;
data[i] = data[i] ^ a[n] ^ b[n] ^ c[n] ^ d[n];
}
Mi pregunta:
¿Este algoritmo tiene una debilidad que me permitirá encontrar la contraseña / descifrar los datos sin usar la fuerza bruta regular (pruebe todas las combinaciones, listas de palabras, etc.)?
(No sé cómo se verán los datos descifrados, por lo que probar el éxito es un rompecabezas en sí mismo, pero creo que buscar secuencias de códigos de máquina válidos debería hacer el truco ...)