Técnicas para escribir algoritmos de cifrado (exclusivamente para uso personal)

18

Me gustaría comenzar con esta pregunta afirmando que comprendo completamente los peligros de escribir sus propios algoritmos de cifrado, y nunca, nunca, utilizaría cifrado casero para proteger los datos de nadie excepto yo mismo.

Hoy me asignaron un proyecto de semestre de informática que reúne todo lo que hemos aprendido en un solo programa. Parte de la funcionalidad de este programa es que puede cifrar y descifrar cadenas. Tenemos que escribir estos métodos de cifrado nosotros mismos, por lo que no podemos usar nada incorporado en el lenguaje que estamos usando (Java). Finalmente, debemos evitar cualquier cosa que use una clave para el cifrado.

Ahora, después de hablar con algunos de mis compañeros de clase, parece que casi todos están usando ROT13 u otro método similar. Debido a que soy un hombre con un rendimiento excesivo, y porque no quiero ser como los demás, quiero diseñar mi propio método de cifrado. Sin embargo, estoy un poco perdido en dónde empezar. Entonces, ¿qué técnicas básicas o avanzadas existen para el cifrado?

    
pregunta Josh 09.12.2011 - 02:47
fuente

9 respuestas

15

Si en general está interesado en la criptografía más allá de su proyecto :

Depende del tipo de cifrado que quieras hacer. Gran advertencia: esta respuesta solo trata de señalarte en la dirección teórica correcta. Recomiendo leer mucho antes de saltar. Cuanto más lea, más comprenderá cómo se rompieron las cifras anteriores y no cometer los mismos errores.

Clave pública

Para operar un sistema de clave pública, necesita una función de trampilla . Desafortunadamente, el consejo en wikipedia es bastante preciso:

  

Se han propuesto varias clases de funciones, y pronto se hizo evidente que las funciones de trampilla son más difíciles de encontrar de lo que se pensaba inicialmente

Las funciones de la trampilla son bastante difíciles; Las permutaciones de la trampilla (donde los conjuntos de salida y entrada de las funciones son las mismas y como tal la función "permuta" la entrada dentro del conjunto) son aún más difíciles. En términos generales, el problema de la factorización principal y el problema del logaritmo discreto son dos "grandes". Las posibilidades están en este campo, usar uno existente será, con mucho, el enfoque más fácil.

Clave simétrica

Los algoritmos de clave simétrica son deliberadamente reversibles, pero sin una de las entradas (la clave) están diseñados para ser muy difíciles de revertir. La idea subyacente es el principio de confusión / difusión . Las técnicas comunes en los sistemas de cifrado modernos incluyen redes de permutación de sustitución y feistel networks . También debe considerar leer sobre bloquear los modos de operación de cifrado .

Bien, genial, ¿dónde debería empezar?

Leyendo - tanto como puedas. No me gustan los consejos estándar "no diseñes tu propio cripto". Creo que la gente debería intentarlo si quiere. Pero no puedo enfatizar lo suficiente lo difícil que es hacerlo bien. Como tiene un tiempo limitado para su proyecto, una técnica podría ser usar un ejemplo simple de un cifrado existente, por lo que:

Para tu proyecto

Como ejercicio educativo, RC4 es muy fácil de implementar. Érase una vez (no hace mucho) que se usaba para proteger el tráfico SSL / WEP; a veces todavía se usa, por lo que estaría usando un cifrado real. Tiene algunos problemas de seguridad . Comprenderlos también lo ayudará en su educación encriptada general. Sin embargo, como su requisito es menos seguridad absoluta y más aprendizaje, habría pensado que sería ideal.

Si te sientes bastante ambicioso y conoces bien tu idioma, AES tampoco es tan difícil de implementar en el modo ECB. FIPS-197 es bastante legible y generalmente explica el algoritmo de una manera bastante accesible.

Tienes razón al considerar a ROT13 un mal ejemplo. Incluso si no sabía que el desplazamiento de cada carácter era de 13 lugares, suponiendo que use ASCII, simplemente pruebe cada una de las 127 (o 255 para ASCII extendido) de su texto cifrado hasta que salga el derecho. Descifrarlo es, por lo tanto, bastante trivial, incluso sin la clave.

    
respondido por el user2213 09.12.2011 - 12:30
fuente
8

¿Debes evitar cualquier cosa que use una clave? Personalmente, no puedo ver cómo se puede llamar "cifrado" a un algoritmo si no se utiliza una clave.

Podría considerar escribir su propia implementación de DES simplificado. Como su nombre lo indica, el DES simplificado (o S-DES) es una versión enormemente simplificada del DES. Utiliza una clave de 10 bits y es lo suficientemente simple como para trabajar con lápiz y papel.

Este documento es el primer hit de Google para "DES simplificado". También hay un simulador visual en enlace .

    
respondido por el Jonathan 09.12.2011 - 14:33
fuente
4

No quiero arruinar tu diversión, pero quieres pensar en lo siguiente:

  1. ¿Qué, intrínsecamente, es el cifrado, de todos modos? ¿Cuáles son las propiedades de las cosas que cifran y descifran y por qué lo hacemos como sociedad? Quieres pensar tanto en las características como en el proceso.
  2. ¿Qué es una clave? Según su investigación, es posible que desee solicitar una aclaración de este punto a su instructor.
  3. Cree un sistema de clasificación de todas las familias de técnicas de encriptación. Al hacer esta investigación, puede encontrar una o dos respuestas interesantes.

Este es un proyecto basado en un semestre, por lo que no es algo que puedas (o debas) responder de la noche a la mañana. El código en sí solo puede tomar uno o dos días. El verdadero aprendizaje es encontrar soluciones basadas en las restricciones dadas.

    
respondido por el logicalscope 09.12.2011 - 03:20
fuente
2

Debes leer El Manual de Crypgoraphy Aplicado . Este libro también se conoce como "El manual". Es gratis, y bien escrito. Sin embargo, el Capítulo 2, "Antecedentes matemáticos" es bastante rígido, la mayoría de estos conceptos no se enseñan en mi universidad pública local (miré).

    
respondido por el rook 09.12.2011 - 03:05
fuente
2

Si desea ver una versión simplificada de "confusión" y "difusión" complejas, William Stallings escribió una excelente Implementación de DES simplificada .

Es bastante fácil que lo dibujé (e hice las transposiciones) en papel cuadriculado. Pero lo llevará a través de todas las funciones básicas que usa DES y lo guiará a través de una sola ronda del proceso de cifrado-descifrado.

    
respondido por el Joseph Kern 11.12.2011 - 05:49
fuente
1

Para el cifrado bidireccional, la mayoría de los algoritmos utilizan una x o un operador, comparando el código binario de una clave y los datos binarios de la entrada, esto podría no ser adecuado para usted, ya que no puede usar una clave ... sin embargo , así es como funciona:

Datos de entrada: 10011101101001 Clave: 123 = 1111011

La clave es más pequeña que la entrada, por lo que debe repetirse:

Datos de entrada: 10011101101001 Clave: 123 = 11110111111011

(en Java use una variable para contar en un bucle para cada uno o un tiempo en todos los bits de la entrada de datos ...) Ahora use x o principal para generar el resultado encriptado (hash bidireccional) en cada uno de los bucles. bit en los datos de entrada y compárelo con el bit correspondiente en la clave, si es idéntico, agregue 0 al resultado; si no, agregue 1 al resultado ... El resultado será:

Datos de entrada: 10011101101001 Clave: 123 = 11110111111011 Resultado = 01101010010010

Para descifrar los datos, simplemente ejecute el canal de datos cifrados:

Datos de entrada: 01101010010010 Clave: 123 = 11110111111011 Resultado = 10011101101001

Lo ideal sería usar una función hash como sha, md5, ripemd, etc ... para generar la clave, luego convertirla en binario ... si no puedes usar un algoritmo prefabricado, podrías crear tu propio algoritmo para generar la clave que se va a comparar ... simplemente haga que todos los bits en la entrada dependan unos de otros para generar el resultado ... ejemplo:

contraseña: abcdefghi abc = 123456789 (a = 1, b = 2, c = 3, etc ...)

haga un bucle de cada bit (dígito) y agréguelos junto con un contador, por ejemplo: cuenta = 0 resultado="" foreach digit in password do resultado = resultado & (dígito + resultado [cuenta-1]) * cuenta) cuenta = cuenta + 1 }

resultado = (1 + 0) * 1 = 1 (2 + 1) * 2 = 6 (3 + 2) * 3 = 15 (4 + 3) * 4 = 28 (5 + 4) * 5 = 45 (6 + 5) * 6 = 66 (7 + 6) * 7 = 91 (8 + 7) * 8 = 120 (9 + 8) * 9 = 153

resultado clave = 16152845669120153 Binario: 111001011000101110110101110100001110000011100010011001 (Este es un ejemplo muy malo, usted ... debería pensar a través de un buen algoritmo ... uno en el que las dos entradas iniciales se combinan y forman la tercera, y luego la tercera y la cuarta van juntas con el resultado de la primera combinación para generar el primer resultado ...)

pero, de nuevo, si no puedes usar una clave, no puedes usar esto ...

    
respondido por el Daniel V 07.10.2012 - 01:56
fuente
1

Dependiendo de las restricciones que se le impongan, puede crear un cifrado extremadamente difícil de descifrar con bastante facilidad: este cifrado tiene fallas prácticas que lo hacen prácticamente inutilizable en el mundo real, pero debe rellenar a los usuarios de ROT13, Caesar, etc. Prácticamente: básicamente, estarás creando un sistema de codificación de entropía, que te ofrece un pad de una sola vez

Escriba algo en bruto, lea todos los archivos en su unidad de disco: esto es bastante fácil, busque un directorio jerárquico recursivo, abra todos los archivos en crudo / binario y extraiga su contenido

A medida que comiences a transmitir en cada flujo de bytes, conviértete en un archivo maestro donde busques una repetición de las subsecuencias (a partir de ahora me referiré a ellas como cadenas, ya que eso es lo que son, simplemente no son cadenas de texto ) en la entrada: debe crear un algoritmo que con el tiempo prefiera las subsecuencias coincidentes más largas posibles, pero puede dividir recursivamente la entrada en cadenas más pequeñas, si observa enlace verás un algoritmo particular para lograr esto, pero no necesitas ir tan lejos, pero las implementaciones probablemente generarán fragmentos de código que simplificarán tu vida.

Ahora, para codificar algo, tome la cadena de entrada y aplique la misma operación, encontrando las subcadenas coincidentes de mayor longitud en el archivo maestro y reemplazando la cadena de entrada con el desplazamiento y la longitud de la subcadena coincidente en el archivo maestro. coincidirá con cualquier cadena, porque al final del día retrocederá buscando bits individuales Una protección que deberá usar es que tiene que desplazarse por el conjunto de todas las cadenas coincidentes antes de comenzar a reutilizar los mismos índices. Imagine un archivo maestro en el que haya alternado 1 y 0 y solo podría hacer coincidir las entradas en el nivel de bits ( técnicamente imposible pero tenga paciencia conmigo: si recibiera una cadena de 5 1, la codificaría como 1: 1,3: 1,5: 1,7: 1,9: 1 (sí, una falla es esta codificación puede volverse horriblemente ineficiente en ciertos casos (nb: si codifica bits, debilitará el código; puntos adicionales si solo mueve el desplazamiento en el mensaje, pero esa es una estrategia de mapeo multidimensional desagradable fuera del alcance de esta publicación)

Lleve un registro del recuento de los índices reutilizados: su objetivo es tener una tabla maestra lo suficientemente grande como para que esto nunca suceda. Si esto ocurre y usted codificara solo un mensaje, es bastante seguro que el universo moriría de muerte por calor antes de la el código se puede descifrar a medida que se codifican más mensajes DONDE SE REUTIDAN LOS ÍNDICES, más se comprimirá su código (análisis de idioma, análisis de patrones, etc.) Ahora, aquí está el problema: para utilizar este código con otra parte, debe obtener una copia de la tabla maestra. Solo debe hacerlo en persona, siempre debe mantener el medio de transferencia bajo su control y debe destruirlo. cuando se completa la transferencia, y si cualquier máquina en la que se encuentra la tabla maestra se comprime, su código está tostado, hasta entonces, es bastante difícil

Diviértete

    
respondido por el Mark Mullin 07.10.2012 - 18:50
fuente
0

Echa un vistazo a la clase de Crypto I de la Universidad de Stanford en coursera. Desglosa las secuencias y los cifrados de bloque, así como el cifrado de clave pública. Estarías mucho más informado si solo vieras las primeras conferencias. Además, el curso también cubre vulnerabilidades y métodos para romper implementaciones criptográficas.

    
respondido por el Andrew 23.01.2013 - 17:56
fuente
-2

Una vez ideé un cifrado propio: -

a) Cree un generador de números pseudoaleatorios (PRNG) de cosecha propia, con un período largo. Para obtener mayores periodos puedes tener múltiples generadores. Debido a que su PRNG es de cosecha propia, usted debe probarlo a fondo para asegurarse de que sea razonablemente aleatorio.

b) Para cada encriptación, genere una semilla para su PRNG de cosecha propia. ¡No debe generarse utilizando su PRNG de cosecha propia! Utilicé el twister mersenne, sembrado por varias cosas como el tiempo en microsegundos y amp; id de proceso

c) XOR el resultado de su PRNG de cosecha propia con el texto simple para producir el texto cifrado, y agregue la semilla de cosecha propia utilizada en el paso 2.

d) El algoritmo de descifrado simplemente extrae la semilla del texto cifrado, luego invierte el cifrado utilizando su PRNG de cosecha propia.

No se utiliza "clave" o "contraseña". La clave es esencialmente tu PRNG de cosecha propia.

Mi PRNG tuvo un período lo suficientemente extenso como para que ninguna secuencia de PRNG pudiera repetirse / reutilizarse dentro del tiempo de vida esperado de los datos o del sistema en sí (es decir, más de 10 años), y lo probé para asegurarme. Me aseguré de que el período fuera muy grande al tener múltiples PRNG (con múltiples semillas) y XORing las secuencias múltiples juntas. El período muy grande significó que cada llamada a mi código de biblioteca de encriptación estaba usando algo así como un pad de una sola vez. La única diferencia fue que cada "pad de una sola vez" era solo pseudoaleatorio y no verdaderamente aleatorio. Un gran beneficio para mí fue que no era necesario compartir claves o administrarlas.

La seguridad de este algoritmo depende de la dificultad de predecir la secuencia PRNG de origen a partir de la semilla. Esta es la razón por la que se debe usar un de PRNG de cosecha propia ... si usó un PRNG "estándar", sería fácil adivinar la secuencia de PRNG a partir de la semilla incrustada en el texto cifrado.

Saludos.

    
respondido por el Mark Taylor 18.07.2014 - 00:34
fuente

Lea otras preguntas en las etiquetas