Protegiendo mi algoritmo de cifrado si el atacante conoce la clave

6

Hoy en día, nuestro profesor de programación nos desafió a hacer un programa de cifrado de texto: le entregaremos un programa que solo encripta (no el código fuente), más un texto cifrado generado por él. Ganamos si no puede descifrar el texto cifrado dado. Si el programa utiliza una clave o algún otro parámetro necesario para el descifrado del texto cifrado, debemos proporcionárselo.

Me pregunto qué opciones tiene para descifrar mi texto cifrado.

En primer lugar, supongo que podría descompilar el programa y descubrir el proceso. Así que decidí hacerlo con PHP en mi servidor web.

La segunda cosa es que, obviamente, no debería usar métodos de cifrado conocidos / populares. Todo lo que tendría que hacer es probar cada método (usando la clave provista).

Así que se reduce a hacer algo original, supongo ... o no. Nada me impide usar varios algoritmos de cifrado populares. Quizás incluso pueda mutar la clave cada vez que aplique uno de los algoritmos.

He visto esta pregunta: ¿Es el cifrado múltiple una buena idea? - y parece que usar diferentes algoritmos de encriptación no es tan útil, pero en mi caso parece una buena idea: ¿cómo podría él know usé AES y luego BlowFish ¿Entonces algo más, etc., incluso si tiene la llave necesaria? ¿Es mi idea factible para este desafío?

    
pregunta Omega 14.07.2015 - 21:18
fuente

2 respuestas

5

Se le solicita que proporcione un programa que realice el cifrado pero no el descifrado. Eso significa que la solución obvia es usar criptografía asimétrica. Cualquier algoritmo de cifrado asimétrico estándar funcionará.

Usted dice:

  

Si el programa utiliza una clave o algún otro parámetro necesario para el descifrado del texto cifrado, debemos proporcionárselo.

Pero solo declaró que tenía que entregar un programa para el cifrado y no para el descifrado. Obviamente, con el cifrado asimétrico, el programa que entregue para el cifrado no hará uso de la clave de descifrado.

Si tuviera que entregar tanto el código de descifrado como la clave de descifrado, no habría nada que pudiera hacer para proteger su cihpertext. Si solo tiene que entregar la clave y no el código, esto abre una gran brecha, podría aprovechar.

Muchos algoritmos criptográficos incluyen constantes de aspecto aleatorio. Si tiene la libertad de diseñar su propio algoritmo, el límite entre las constantes en el algoritmo y la clave se puede manipular como desee. Tome cualquier algoritmo estándar, llame a las constantes en el algoritmo la clave y entréguelas y llame la clave de las constantes del algoritmo original (que luego se codificará en el programa de descifrado, que no tiene que entregar).

Eso ciertamente sería doblar las reglas para su beneficio, pero aún estaría dentro de la palabra de las reglas como se indica en su pregunta. Por supuesto, no puedo descartar la posibilidad de que haya redactado de forma accidental las restricciones de forma diferente a como estaba previsto, en cuyo caso es posible que esta solución no se aplique.

También preguntas:

  

Así que todo se reduce a hacer algo original, supongo

Me sorprendería si esa fuera la intención. Ciertamente, crear un algoritmo original no se considera la forma en que se logra la seguridad.

Tal vez el profesor quería hacer un punto sobre la seguridad de los algoritmos originales al mostrar cómo se romperían todos los algoritmos originales. Sin embargo, si esa es la intención del desafío, entonces el profesor corre el riesgo de que una de las soluciones solo tenga vulnerabilidades demasiado sutiles para que el profesor las explote de inmediato.

    
respondido por el kasperd 14.07.2015 - 21:57
fuente
3

Por lo tanto, su profesor le está obligando a usar Seguridad a través de la oscuridad . Interesante. En el mundo real, usted diseña un sistema de seguridad alrededor del principio de Kerckhoffs de que debe asumir que un atacante sabe todo acerca de su sistema. excepto las teclas. Esta asignación es exactamente lo contrario, interesante.

Primero, un punto delicado pero importante: la frase "Ganamos si no puede descifrar el texto cifrado dado". debe activar las campanas de advertencia porque la idea de que puede crear un sistema "irrompible" es uno de los mayores conceptos erróneos acerca de la seguridad de la información: no puede.

Si se le da suficiente tiempo y esfuerzo, un atacante inteligente puede romper cualquier sistema de cifrado, sin importar qué tan bien construido esté. Por eso me encanta la frase "endurecer un sistema" porque implica que estás haciendo las cosas más difíciles para el atacante, pero admite que todavía es posible romperlas.

En cuanto a tu tarea, supongo que la pregunta principal es averiguar qué está buscando el profesor. Supongo que él está mirando para ver si ha pensado en una serie de posibles ataques, y que puede armar los bloques de construcción criptográficos de una manera sensata. (También puede estar esperando que un estudiante lo sorprenda con un nuevo sistema inteligente en el que nunca se le ha ocurrido).

Tu idea de hacer todo en el lado del servidor para que no tenga ejecutables para descompilar es una gran idea.

Algunas otras cosas en las que pensar (por encima de mi cabeza):

  1. No inventes el tuyo, es un mejor uso de tu tiempo para combinar bloques de construcción comunes de una manera inteligente.

  2. Parece que está esperando que encadenes varios algoritmos de cifrado. Como se señaló en la pregunta vinculada, no se usa mucho en la práctica porque viola el principio de Kerckhoffs, pero tiene mucho sentido para su asignación, así que comience con eso.

  3. Tiene que darle todo el material de inicialización / clave, por lo que probablemente intentará hacer algunas suposiciones en función del tamaño de las claves ("ah, esto parece una clave RSA de 1024 bits, intentemos RSA ... "). Pero nada dice que las claves reales tienen que ser las mismas que tiene el profesor, solo que tienes que poder derivar las claves reales del material de claves que le das. Me gustaría ver Funciones de derivación de claves y Key Stretching Functions como formas de rodear el material clave antes de usarlo (concatenar / truncar hashes también es un buen truco).

  4. Si se le permite usar su idea completamente del lado del servidor, piense en limitar la frecuencia con la que puede enviar un texto simple para encriptarlo (es decir, solo 1 intento cada 5 segundos).

  5. Incluso si tiene que darle un binario, use una función de estiramiento de teclas / función hash realmente lenta para que tenga que perder mucho tiempo esperando a que se ejecute.

Como dijo @Schroeder, este es un problema divertido y me encantaría seguir pensando en ello, pero probablemente debería volver al trabajo ...

    
respondido por el Mike Ounsworth 14.07.2015 - 22:10
fuente

Lea otras preguntas en las etiquetas