¿Es realmente difícil crear un protocolo criptográficamente seguro?

Un algoritmo criográficamente seguro es **** MUY **** difícil de escribir, porque a pesar de sus mejores esfuerzos, siempre hay fallas teóricas y de implementación. Con el fin de demostrar lo difícil que es, aquí va un pequeño intento que hice en los últimos 30 minutos, no un intento serio, por cierto.

De una manera teóricamente difícil de romper, una almohadilla de una sola vez, este programa cifrará cualquier cadena que consista en minúsculas. Sin embargo, falla debido a una falla de implementación obligatoria.

Necesito pasar el pad en texto plano, así que envío los primeros 26 caracteres de la salida de este programa en un mensaje y el resto en otro. Estoy usando una nueva línea para mostrar los diferentes mensajes.

Descargo de responsabilidad: dado que hice esto fuera de mi cabeza en 30 minutos, es probable que contenga cualquier cantidad de errores, por lo que es totalmente inutilizable incluso como punto de partida para su propio algoritmo. En las 4 horas desde que lo escribí, he encontrado 3 errores hasta ahora solo de pensarlo, no de probarlo de manera seria.

El siguiente método de descifrado no es 100% estable. Lo dejaré como un ejercicio para que el lector descubra por qué. Ver comentarios para otros errores. Veamos cuánto tiempo lleva convertir esto en algo que funcione, aunque con los defectos teóricos que se enumeran a continuación. Nada más demostrará cuán difícil es realmente hacer un algoritmo seguro.

Scramble clase pública
{
public static void main (String [] args)
{
Scramble scramble = new Scramble ();
System.out.println (scramble.doIt (“helloworld”));
}

Scramble público ()
{
hash = nuevo byte [26];

para (int i = 0; i <26; i ++) {
hash [i] = (byte) (Math.random () * 26);
System.out.print ((char) (hash [i] + ‘a’));
}

System.out.println ();
}

cadena pública doIt (cadena)
{
Cadena ret = “”;

para (byte b: s.getBytes ())
ret + = (char) (b ^ hash [b-‘a ‘]);

volver ret;
}

byte privado [] hash;
}

Salida de muestra:

aotfdhofiapyulyctxtiafqgpb
mfttwgweta

Se descifra leyendo el pad de una sola vez (la primera línea) en la matriz hash, luego haciendo XOR con la segunda línea y ejecutándolo a través de doIt ()).

La ilustración anterior proporciona una buena prueba de por qué cualquier intento no creativo de ser creativo puede causar problemas. Como aficionado, es posible que me engañe y piense que solo enviar el bloc por separado es lo suficientemente bueno, pero como se trata de texto sin formato, no lo es.