Estoy familiarizado con la Ley de Schneier:
Cualquier persona puede inventar un sistema de seguridad tan inteligente que no pueda imaginar una forma de romperlo.
He leído las muchas publicaciones en este intercambio lleno de preguntas sobre cómo escribir su propio algoritmo de seguridad, y he leído las respuestas obvias de por qué es una idea terrible fuera de un experimento mental.
Esta pregunta pretende ser diferente, aunque probablemente será igual de ignorante que el resto. Sin embargo, estoy interesado en lo que todos ustedes tienen que decir.
Cuando pienso en el cifrado, lo veo aproximadamente así:
(data) * (algo % key) = (encrypted data)
en otras palabras, tome algunos datos, agregue una contraseña a través de un algoritmo y obtendrá datos encriptados.
Pero, ¿y si el algoritmo fuera la contraseña? ¿Qué pasaría si escribiera un programa pequeño y simple que modificaría los datos que le proporcionó y luego destruyó el programa después de cada uso?
Por ejemplo, lo mantendremos muy simple. Tienes una cadena de palabras como
"My name is Alice"
Supongamos que escribes un programa muy, muy simple que toma esta cadena y la modifica:
std::string input="My name is Alice";
std::string output;
std::string oginput;
for(char& c : input) {
output += (c + 1);
}
for(char& c : output) {
oginput+= (c - 1);
}
std::cout<<output<<std::endl;
std::cout<<oginput<<std::endl;
Salida:
Nz! obnf! jt! Bmjdf
Mi nombre es Alice
La idea es simple: agregue 1 a cada carácter para cifrar, reste 1 de cada carácter para descifrar. Este tipo de programa es lo suficientemente simple para que la idea de lo que hace pueda ser recordada, y lo suficientemente simple para volver a implementarlo, incluso si su sintaxis o medios (las funciones) son diferentes. Incluso una idea más compleja, puede ser lo suficientemente simple como para recordar cómo implementarla, incluso si es una página o dos de código para hacerlo.
Entonces, si toma este algoritmo en su cabeza, escriba un programa que modifique una parte de los datos de alguna manera, luego destruya el programa (asumamos que el código, el programa compilado, los archivos obj, etc. no se almacenan en el disco duro). o guardados de cualquier manera - son 100% desaparecidos para siempre).
Ahora estás sentado con un blob aleatorio de datos Nz!obnf!jt!Bmjdf
sin punto de inicio para conectarlo, sin algoritmos conocidos para descifrarlo contra w / un montón de claves, etc. Acabas de ingresar una entrada, la has activado de manera tan simple que solo usted sabe cómo invertir, y destruyó cualquier migaja de galleta en el camino.
¿Es esta una forma viable de encriptación para las personas técnicamente inclinadas? Por supuesto, este ejemplo es lo suficientemente simple como para descifrar, se pueden encontrar patrones, etc. Pero una serie de pequeños cambios en los datos en un orden secreto, y quizás múltiples iteraciones, se agregan muy rápidamente a la entropía.