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.
- ¿Es hora de reemplazar el protocolo de Internet actual con algo nuevo y diferente?
- ¿Cuáles son las desventajas de la marca registrada del protocolo de Madrid?
- ¿Qué es el protocolo SS7? ¿Pueden los hackers usarlo contra mí?
- ¿Qué se entiende por protocolo de protocolo de enlace?
- ¿Cuál fue el propósito original del correo electrónico?
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.