Cifrado de Vigenère

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 10 de junio de 2020; las comprobaciones requieren 18 ediciones .

El cifrado Vigenère ( fr.  Chiffre de Vigenère ) es un método de cifrado polialfabético de texto literal utilizando una palabra clave. [una]

Este método es una forma simple de sustitución polialfabética. El cifrado Vigenère se ha inventado muchas veces. Este método fue descrito por primera vez por Giovan Battista Bellaso ( el italiano  Giovan Battista Bellaso ) en el libro La cifra del. Sig. Giovan Battista Bellas® en 1553 [2] , pero en el siglo XIX recibió el nombre de Blaise Vigenère [3] , diplomático francés. El método es simple de entender e implementar, pero es inaccesible a los métodos simples de criptoanálisis . [cuatro]

Aunque el cifrado es fácil de entender e implementar, durante tres siglos ha resistido todos los intentos de descifrarlo; que ganó el nombre de le chiffre indéchiffrable ( cifra sin resolver )  . Mucha gente ha tratado de implementar esquemas de cifrado que son esencialmente cifrados de Vigenère. [5]

Historia

En 1466, Leon Alberti , el famoso arquitecto y filósofo, presentó un tratado sobre cifras a la oficina papal. El tratado analiza varios métodos de cifrado, incluido el enmascaramiento del texto sin formato en algún texto auxiliar. El trabajo concluye con su propio cifrado, al que llamó "un cifrado digno de reyes". Era un cifrado polialfabético implementado como un disco de cifrado. La conclusión es que este cifrado utiliza varias sustituciones de acuerdo con la clave. Alberti inventó más tarde el código de descifrado. Este invento se adelantó mucho a su tiempo, ya que este tipo de cifrado comenzó a usarse en los países europeos solo 400 años después. [6]

En 1518 se dio un nuevo paso en el desarrollo de la criptografía con la aparición en Alemania del primer libro impreso sobre criptografía. El abad Johann Trithemius, abad del monasterio de Würzburg, escribió el libro "Polygraphy", que describe una serie de cifras. Uno de ellos utiliza la " tabla de Tritemius " (ahora la "tabla de Vigenère") y desarrolla la idea de sustitución polialfabética. El sistema de encriptación es el siguiente: la primera letra del texto fuente es encriptada por la primera línea, la segunda por la segunda, y así sucesivamente. Después de usar la última línea, la siguiente letra se cifra nuevamente en la primera línea. No hay clave en el cifrado de Trithemius, el secreto es el método de cifrado en sí. [cuatro]

El siguiente paso en el desarrollo del método de encriptación propuesto por Trithemius lo dio el italiano Giovanni Belazo. En 1553 se publicó su folleto Cifra del signor Belazo. En este cifrado, la clave es la llamada contraseña: una frase o una palabra. La contraseña se escribía periódicamente sobre las letras del texto sin formato. La letra de la contraseña, encima de la letra correspondiente del texto sin formato, indicaba el número de la línea en la tabla de Trithemius, según la cual se debe realizar el reemplazo (cifrado) de esta letra. [cuatro]

Posteriormente, las ideas de Trithemius y Belazo fueron desarrolladas por el compatriota de Belazo, Giovanni Battista Porta . Propuso abandonar el orden alfabético de las letras en la primera línea de la tabla de Trithemius y reemplazar este orden por uno arbitrario, que es la clave de cifrado. Las filas de la tabla todavía se desplazaban cíclicamente. En su libro Sobre la correspondencia secreta (publicado en 1563 [6] ), Porta propuso un cifrado de bigrama y también proporcionó una descripción de un dispositivo de disco mecánico que implementa un reemplazo de bigrama. [cuatro]

A mediados del siglo XVI, el libro de G. Cardano "Sobre las sutilezas" apareció en Italia con la adición "Sobre varias cosas". Allí se reflejaron nuevas ideas de criptografía: el uso de una parte del propio texto plano transmitido como clave de cifrado (la idea de la "clave propia") y un nuevo método de cifrado que pasó a la historia como el “ Red de Cardano ”. [cuatro]

El embajador de Francia en Roma , Blaise de Vigenère , al conocer las obras de Trithemius, Belazo, Cardano, Porta, Alberti, también se interesó por la criptografía. En 1585, escribió un Tratado sobre cifrados, que describe los conceptos básicos de la criptografía. En esta obra, comenta: “Todas las cosas en el mundo son una cifra. Toda la naturaleza es sólo una cifra y una carta secreta". Esta idea fue repetida más tarde por Blaise Pascal  , uno de los fundadores de la teoría de la probabilidad, y en el siglo XX por Norbert Wiener  , el "padre de la cibernética". [cuatro]

De hecho, Vigenère combinó los enfoques de Trithemius, Bellazeau, Port para el cifrado de textos planos, esencialmente sin introducir nada original en ellos. En nuestro tiempo, el "cifrado de Vigenère", que consiste en la continuación periódica de la palabra clave en la tabla de Trithemius, ha suplantado los nombres de sus predecesores. [4] David Kahn , en su libro The Codebreakers , desaprobaba esto, escribiendo que la historia "ignoró un hecho importante y nombró el cifrado en honor a Vigenère, a pesar de que no hizo nada para crearlo" [7] .

El cifrado Vigenère tenía la reputación de ser excepcionalmente resistente al descifrado "manual". El famoso escritor y matemático Charles Lutwidge Dodgson ( Lewis Carroll ) calificó el cifrado de Vigenère como indescifrable en su artículo El cifrado alfabético .  The Alphabet Cipher , publicado en una revista infantil en 1868. En 1917, Scientific American también se refirió al cifrado Vigenère como indescifrable. [8] Esta noción fue refutada después de que Kasiski descifrara por completo el cifrado en el siglo XIX, aunque se sabe que algunos criptoanalistas experimentados descifraron el cifrado ya en el siglo XVI. [7]

El cifrado de Vigenère es lo suficientemente simple para usarse en el campo, especialmente si se usan discos de cifrado. Por ejemplo, los "Confederados" utilizaron un disco de cifrado de cobre para el cifrado de Vigenère durante el transcurso de la Guerra Civil . Los mensajes confederados estaban lejos de ser secretos, y sus adversarios pirateaban regularmente los mensajes. Durante la guerra, el comando confederado se basó en tres frases clave: "Manchester Bluff", "Victoria completa" y, cuando la guerra llegaba a su fin, "Come Retribution". [7]

Gilbert Vernam trató de mejorar el cifrado descifrado (se llamó el cifrado Vernam-Vigenère en 1918), pero a pesar de sus mejoras, el cifrado siguió siendo vulnerable al criptoanálisis . Sin embargo, el trabajo de Vernam finalmente resultó en el cifrado de Vernam , que de hecho es imposible de descifrar. [9]

Descripción

En el cifrado César, cada letra del alfabeto se desplaza varias posiciones; por ejemplo, en un cifrado César, con un cambio de +3, A se convertiría en D, B se convertiría en E, y así sucesivamente. El cifrado Vigenère consiste en una secuencia de varios cifrados César con diferentes valores de desplazamiento. Para el cifrado, se puede utilizar una tabla de alfabetos llamada tabula recta o cuadrado (tabla) de Vigenère. Con respecto al alfabeto latino, la tabla Vigenère se compone de líneas de 26 caracteres cada una, con cada línea siguiente desplazada varias posiciones. Por lo tanto, hay 26 cifrados César diferentes en la tabla. Cada etapa del cifrado utiliza diferentes alfabetos, seleccionados según el carácter de la palabra clave. Por ejemplo, supongamos que el texto fuente se ve así:

ATAQUE AL AMANECER

La persona que envía el mensaje escribe la palabra clave (" LIMÓN ") en un bucle hasta que su longitud coincida con la longitud del texto original:

LIMÓNLIMÓN

El primer carácter del texto sin formato ("A") se cifra con la secuencia L, que es el primer carácter de la clave. El primer carácter del texto cifrado ("L") está en la intersección de la fila L y la columna A en el cuadro de Vigenère. De manera similar, para el segundo carácter del texto fuente, se usa el segundo carácter de la clave; es decir, el segundo carácter del texto cifrado ("X") se obtiene en la intersección de la fila E y la columna T. El resto del texto sin formato se cifra de manera similar.

Texto original: ATTACKATDAWN Clave: LIMÓN LIMÓN Texto cifrado: LXFOPVEFRNHR

El descifrado se realiza de la siguiente manera: encontramos en la tabla Vigenère la línea correspondiente al primer carácter de la palabra clave; en esta cadena encontramos el primer carácter del texto cifrado. La columna en la que se encuentra este carácter corresponde al primer carácter del texto fuente. Los siguientes caracteres de texto cifrado se descifran de manera similar.

Si  es el número de letras del alfabeto,  es el número de la letra del texto sin formato,  es el número de la letra clave del alfabeto, entonces el cifrado de Vigenère se puede escribir de la siguiente manera:

Y descifrado:

[diez]

En una computadora, tal operación corresponde a la adición de los códigos ASCII de los caracteres del mensaje y el módulo de teclas. Parece que si la tabla es más compleja que el cambio cíclico de filas, entonces el cifrado se volverá más confiable. Esto es cierto si se cambia con más frecuencia, por ejemplo, de una palabra a otra. Pero la compilación de tales tablas, que son cuadrados latinos, donde cualquier letra aparece una vez en una fila o columna, es laboriosa y debe hacerse solo en una computadora. Para un cifrado polialfabético manual, solo se basan en la longitud y la complejidad de la clave, utilizando la tabla dada, que no se puede mantener en secreto, y esto simplifica el cifrado y el descifrado. [once]

Aplicación

En el siglo XIX, se generalizó el llamado método de encriptación de pads. Fue utilizado por revolucionarios populistas , espías, etc. El cifrado utiliza frases tomadas del idioma como clave de cifrado. Por ejemplo, la frase: "14 de julio: cumpleaños de María". Si usamos la numeración de las letras del alfabeto inglés aceptadas como ejemplos, entonces Marysbirthday significa . Para cifrar la frase Iamgoing ↔ , se agrega el texto mod26 a la clave, que es la frase grabada. Resulta

↔ UADEGJV X.

Como puede ver, en este caso, se trata de un juego ordinario . El criptógrafo francés Vigenère sugirió utilizar este tipo de clave incluso en los casos en que el texto es más largo que la clave, imponiéndola tantas veces como sea necesario. En este caso, no es necesario en absoluto que la clave se obtenga de una frase significativa. Además, es incluso indeseable, ya que el significado puede ayudar al descifrador de la cifra. Tomemos, por ejemplo, el texto:

UN HUMO DE LA PATRIA NOS ES DULCE Y AGRADABLE ↔ y clave: .

El cifrado se obtiene mediante gamma mod26:

Entonces, el cifrado de Vigenère se obtiene como una combinación repetitiva de turnos. En general, este cifrado no conserva la frecuencia de aparición de las letras y, por esta razón, no puede someterse directamente a un análisis estadístico.

Criptoanálisis

El cifrado de Vigenère "desdibuja" las características de frecuencia de la aparición de caracteres en el texto, pero permanecen algunas características de la aparición de caracteres en el texto. La principal desventaja del cifrado Vigenère es que su clave se repite. Por lo tanto, un criptoanálisis simple de un cifrado se puede construir en dos pasos:

  1. Búsqueda de longitud de clave. Es posible analizar la distribución de frecuencias en el texto cifrado con diferente diezmado. Es decir, tome un texto que incluya cada 2 letras del texto cifrado, luego cada 3 letras, etc. Tan pronto como la distribución de frecuencias de letras difiera mucho del uniforme (por ejemplo, en entropía), entonces podemos hablar sobre la longitud de la clave encontrada. .
  2. Criptoanálisis. Un conjunto de cifrados l César (donde l  es la longitud de la clave encontrada), que individualmente se descifran fácilmente.

Las pruebas de Friedman y Kasiska pueden ayudar a determinar la longitud de la clave.

La prueba de Kasiska y cómo determina la longitud de la clave

Charles Babbage fue el primero en desarrollar un algoritmo de ataque para el cifrado de Vigenère en 1854. El ímpetu para el desarrollo del algoritmo fue un intercambio de cartas con John H. B. Thwaites. Afirmó haber creado un nuevo cifrado y lo envió a la Revista de la Sociedad de las Artes; Cuando Babbage mostró que el cifrado de Thwaites era solo un caso especial del cifrado de Vigenère, Thwaites le pidió que lo descifrara. Babbage descifró el texto, que resultó ser el poema "La visión del pecado" de Alfred Tennyson , cifrado con la palabra clave Emily, el nombre de la esposa del poeta. Pero no publicó su descubrimiento. Por lo tanto, este algoritmo lleva el nombre de Friedrich Wilhelm Kasiska , un oficial del ejército prusiano que, independientemente de Babbage, desarrolló el mismo algoritmo en 1863. Y solo en el siglo XX, cuando los científicos estudiaron las notas de Babbage, apareció información sobre el primer inventor de este algoritmo. [12]

Primero, definimos la noción de índice de coincidencia de un texto dado. Deje que el texto se considere correspondiente al alfabeto que consta de letras. Sea  la longitud de este texto. Indicar por el número de ocurrencias de la letra con el número en el texto . Entonces el índice de coincidencia de texto se define como

.

Se ha verificado empíricamente que el índice de coincidencia de textos en inglés largos y significativos, como Moby Dick de Mellville , es de aproximadamente 0,065. En este caso, por supuesto, solo quedan 26 letras del alfabeto inglés en el texto. Al mismo tiempo, un texto bastante largo absolutamente aleatorio de 26 letras, en el que todas las letras aparecen aproximadamente el mismo número de veces, es igual a 0,038. Se observa que cuanto más “significativo” es el texto, mayor es su índice de coincidencia. Esta circunstancia solo ayuda a calcular la longitud de la clave en el cifrado de Vigenère.

Sea  el texto original, en el que  está su letra th, y  es su cifra Vigenère. Si se aplica un cambio normal, es decir, la longitud de la clave , entonces se debe mantener la igualdad , ya que solo se cambia el número de letras, pero no el número de sus ocurrencias. Dado que  es un texto significativo (por suposición), el valor de , será aproximadamente igual al valor estándar de , para el idioma dado. Por lo tanto, se considera un ejemplo de inglés ordinario . Por supuesto, es poco probable que el cifrado de Vigenère se obtenga en el caso general con una clave de longitud 1. Por lo tanto, los siguientes índices de coincidencia se calculan secuencialmente: hasta .






Esto puede indicar que la longitud de la clave es , aunque puede ser un rastro falso.

En efecto, si la longitud de la clave es igual a , entonces el texto se obtendrá del turno, por lo tanto, almacenará , y el texto , a su vez, es una muestra aleatoria de texto significativo, por lo tanto, debe conservar sus características estadísticas, en particular, el índice de coincidencia.

Si se desconoce el índice de coincidencia de algún idioma, también es posible utilizar la prueba de Kasiski. Es necesario no comparar los valores recibidos de los índices de coincidencia con el valor estándar, sino observar cuando este índice aumenta bruscamente. Esto puede indicar una longitud de clave encontrada. Por supuesto, estamos hablando de descifrar textos significativos y al mismo tiempo bastante largos. Sin embargo, el concepto de significado para los lenguajes formales no es un concepto fácil.

Otra aplicación de la prueba de Kasiski es comprobar que se conservan las frecuencias de las letras encontradas en el cifrado. Sea  el texto cifrado, y el algoritmo de cifrado es desconocido. Si se sabe que se usó el alfabeto inglés normal y el valor es cercano a 0,065, esto sugiere que se usó un cifrado que preserva la frecuencia. Es posible que se trate de un cifrado de sustitución simple. En una situación en la que el valor está lejos de 0.065, se puede suponer que se usó un cifrado que no conservó la frecuencia, o el texto no tenía sentido, o se usó un alfabeto diferente, etc. En una palabra, algo resultó ser mal y se necesita un análisis más profundo.

Volvamos al cifrado de Vigenère. Definamos correctamente la longitud de la clave igual a . Ahora necesitas encontrar la clave en sí.

Un histograma construido de acuerdo con las frecuencias estándar de las letras de un idioma tiene sus propias características distintivas. Se explican por el uso extremadamente desigual de letras en el idioma inglés. Esta irregularidad solo hace posible aplicar efectivamente el análisis de frecuencia.

En primer lugar, llaman la atención los "picos" correspondientes a las letras A, E, H, I, N, O, R, S, T, y los "tocones" correspondientes a J, Q, X, Z". por lado, hay incluso un trío completo: R, S, T. Todos juntos dan un alivio muy específico.

Si se usa un cambio de 4, entonces la imagen cambia cíclicamente. Hay un cambio de alivio cíclico de 4 unidades. Si no conoce la magnitud del cambio, entonces no es difícil restaurarlo, guiado por el sentido común.

Máquinas rotativas

Es posible mejorar el cifrado de Vigenère considerando una combinación de sustituciones arbitrarias como clave repetitiva: . Esto significa que las unidades del texto fuente se convierten a unidades respectivamente en etc.

Al descifrar un cifrado de este tipo, como en el caso del cifrado de Vigenère, primero se debe determinar la longitud de la clave . Esto se puede hacer usando la prueba de Kasiski de la misma manera que en el caso descrito. Además , se puede aplicar el análisis de frecuencia para determinar las sustituciones.

Análisis de frecuencia

Una vez que se conoce la longitud de la clave, el texto cifrado se puede escribir en varias columnas, cada una correspondiente a un carácter de la clave. Cada columna consta del texto original, que está encriptado con un cifrado César ; la clave del cifrado César es solo un carácter de la clave del cifrado Vigenère, que se utiliza en esta columna. Usando técnicas similares a las de descifrar el cifrado César, el texto cifrado se puede descifrar. Una mejora de la prueba de Kasiska, conocida como método de Kirchhoff, compara la frecuencia de aparición de caracteres en las columnas con la frecuencia de aparición de caracteres en el texto de origen para encontrar el carácter clave de esa columna. Cuando se conocen todos los caracteres de la clave, el criptoanalista puede descifrar fácilmente el texto cifrado del texto sin formato. El método de Kirchhoff no es aplicable cuando la tabla de Vigenère está codificada en lugar de usar la secuencia alfabética habitual, aunque la prueba de Kasiska y las pruebas de coincidencia todavía se pueden usar para determinar la longitud de la clave para este caso. [13]

Menciones en la literatura

En 1881, Julio Verne escribió la novela Jangada . En esta novela, el autor utilizó el cifrado Vigenère para cifrar el documento. Como texto cifrado, el autor utiliza el siguiente documento:

SGUCHPVELLZIRTEPNNDNFGINBORGYUGLCHD KOTKHZHGUUMZDHRЪSGSYUDTPЪARVYGGISCHVCH EECSTOUZHVSEVHAHYAFBBETFZSEFTHZHZBZ êGFBSCHKHRPZhTZVTZJYTGOYBNTFFEOICHT TEGIOKZPTFLEUGSFIPTMOFOXHMBBT JFYGUCHOYUNFNSHZGELLSHRUDENKOLGGNSBK SSEUPNFTSEEHUEVOSJNOYIONRSITKTSEDB UBTETLOTBFFTSSBYPMPZTZHPTUFKDG

En el transcurso de la historia, los héroes encuentran un fragmento de la palabra descifrada de este documento: ORTEGA Los héroes adivinaron que este nombre podría significar la firma al final del documento. Así sale:

O R T E G A T U V K D G

Por lo tanto, la clave es 432513. Conociendo la clave, puede traducir fácilmente este documento:

LA VERDADERA CAUSA DEL ROBO DE DIAMANTES SGUCHPVELL ZIRTEPND NFGIN BORGYUG Y LA MUERTE DE SOLDADOS DE LA PROTECCIÓN EN LA NOCHE EN L CHDKOTKHZHG UUMZDH RЪSGSYu D TPIA RV EL VEINTICINCO DE ENERO DE MIL YGGISCHVCHE ETSSTUZH VSEVHA HYAFBBB OCHOCIENTOS VIGÉSIMO SEXTO ETFZSEFTKh ZHZBZЪGFB SCHIKHHRIP ZHTZV NO JOAM DACOSTA, INJUSTO EN TJ YTGO YBNTFFFE OIKHTTEGIIIOKZP TFL HABLADO A MUERTE Y YO INFELIZ EUGSFIPTM O FOKSHM G B TJFYGUCHOYUN EMPLEADO DEL DEPARTAMENTO DIAMANTE FNSHZGALL SCHRUDENKOLG GNSBCSSEU CONDADO; SÍ, SOY UNO, EN QUÉ Y FIRMAS PNFTVER EG G SZHNO Y YIO N RSITKTS GUERRA EN MI NOMBRE REAL, EDBUB TETLO TBFTSSBUYP MPZTZHP ORTEGA TUFKDG

Opciones

Hay muchos otros cuadrados memorables que pueden usarse como base para un sistema polialfabético de la misma manera que el cuadrado de Vigenère. Una de las más famosas es la plaza Beaufort . Sus líneas son las líneas del cuadrado de Vigenère, escritas en orden inverso. Lleva el nombre del almirante Sir Francis Beaufort  , el inventor de la escala de velocidad del viento. Si en el cuadrado de Vigenère la primera fila y la columna apuntan a filas y columnas, respectivamente, entonces en el cuadrado de Beaufort, la primera fila y la última columna sirven para estos propósitos. [catorce]

La variante de clave de ejecución del cifrado de Vigenère alguna vez fue indescifrable. Esta versión utiliza un bloque de texto de igual longitud que el texto original como clave. Dado que la clave tiene la misma longitud que el mensaje, los métodos propuestos por Friedman y Kasiski no funcionan (porque la clave no se repite). En 1920, Friedman fue el primero en descubrir las desventajas de esta opción. El problema con la clave de ejecución del cifrado Vigenère es que el criptoanalista tiene información estadística sobre la clave (dado que el bloque de texto está escrito en un idioma conocido) y esta información se reflejará en el texto cifrado. Si la clave es realmente aleatoria, su longitud es igual a la longitud del mensaje y se usó una vez, entonces el cifrado Vigenère será teóricamente indescifrable, de hecho, esta opción ya será el cifrado Vernam-Vigenère, para el cual absoluto La fuerza criptográfica ha sido probada.

A pesar de la aparente solidez del cifrado Vigenère, no se usó mucho en Europa. Más común fue el cifrado de Gronsfeld , creado por el conde Gronsfeld, idéntico al cifrado de Vigenère excepto que solo usaba 10 alfabetos diferentes (correspondientes a los dígitos del 0 al 9). La ventaja del cifrado de Gronsfeld es que no se utiliza una palabra como clave, sino una secuencia digital que se repite hasta llegar a ser igual a la longitud del mensaje cifrado. El cifrado Gronsfeld se usó ampliamente en Alemania y Europa a pesar de sus deficiencias.

Implementación

JavaScript

El código //Puedes copiar y pegar todo este código en la consola de tu navegador. var a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; //Cadena alfabética var m = "ATTACKATDAWN" ; //Mensaje var k = "LIMÓN" ; //Llave function Vizhener ( m , k , mode ){ //(cifrar/descifrar) para "Gronsfeld" + "Vizhener" + "Beaufort" + "Shifted Atbash" //m - mensaje o texto cifrado (también puede ser una clave si Beaufort cifrado), //k - clave (o mensaje/texto cifrado si es un cifrado de Beaufort), //modo - modo: // Cifrado: "cifrar" (predeterminado), // Descifrado: "descifrar" (modo === 'descifrar' ), // Cifrado-descifrado según la tabla atbash desplazada: (mode==='shifted_atbash') // Extraer dígitos de la clave de cifrado de Gronsfeld: "gronsfeld" o "gronsfeld_encrypt", "gronsfeld decrypt". var maxlength = Matemáticas . max ( m . longitud , k . longitud ); var r = '' ; //Resultado vacío para ( i = 0 ; i < maxlength ; i ++ ){ //cifrar/descifrar //Vizhener - cifrar/descifrar una fórmula (cifrar - por defecto; descifrar - cuando (modo === 'descifrar' ) var mi = a . indexOf ( m [ ( ( i >= m . longitud ) ? i % m . longitud : i ) ] ); //ajustar mensaje/texto cifrado - a la clave (si es menor) var ki_s = k [ ( ( i >= k . length ) ? i % k . length : i ) ]; // ajusta la clave al mensaje/texto cifrado (si es corto) var ki = ( typeof mode !== 'undefined' && mode . indexOf ( 'gronsfeld' ) !== - 1 ) ? parseInt ( ki_s ) : a . indexOf ( ki_s ); //resta durante el descifrado o suma. ki = ( ( modo typeof !== 'indefinido' && modo . indexOf ( 'descifrar' ) !== - 1 ) ? ( - ki ) : ki ); c = a [ ( ( ( a . longitud + ( mi + ki ) ) % a . longitud ) ) ]; //símbolo según la tabla de Vigenère. c = ( modo === 'shifted_atbash' ) ? un [ un . longitud - 1 - a . índiceDe ( c )] : c ; // Atbash personaje o personaje. r += c ; //Agregue un caracter al resultado. } devuelve r ; //devuelve la cadena de resultado } //Pruebas: //una. Cifrado de Gronsfeld. (Una versión truncada del cifrado Vigenère). //Parámetros: m - mensaje/texto cifrado, k - clave (solo dígitos), modo - consola "cifrar/descifrar" . log ( '\n\n1. Cifrado Gronsfeld (Versión simplificada del cifrado Vigenère con clave digital):' , '\n' + 'm = ' , 'GRONSFELD' , ' - mensaje' , '\n' + 'k = ' , '2015' , '- key' , '\n' + 'Cifrado de Gronsfeld - cifrado: ' , Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ) //produce IRPSUFFQF - cifrado de Gronsfeld , '\n ' + 'Cifrado de Gronsfeld - descifrado: ' , Vizhener ( Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ), '2015' , 'descifrado de gronsfeld' ) // producirá GRONSFELD - a partir del cifrado de Gronsfeld , '\ n' + 'Comparar con el mensaje: ' , "( descifrado === m )" , ( Vizhener ( Vizhener ( 'GRONSFELD' , '2015' , 'gronsfeld' ), '2015' , 'gronsfeld_decrypt' ) === ' GRONSFELD' ) // m?verdadero ); //2. Además, en lugar de números, en el cifrado de Gronsfeld también es posible indicar letras. //Entonces, el cifrado Gronsfeld será un cifrado Vigenère regular, pero con un límite de caracteres por clave. //Por ejemplo, con todos los dígitos posibles en la clave "0123456789", la clave solo puede ser de las letras "ABCDEFGHIJ" //Puedes obtenerla así: var Gronsfeld_key = '2015' ; var Vizhener_key = Gronsfeld_key . dividir ( '' ). mapa ( función ( x ){ devuelve un [ parseInt ( x )]}). unir ( '' ); //CABF //Y viceversa: var Gronsfeld_key2 = Vizhener_key . dividir ( '' ). map ( función ( x ){ devuelve a . indexOf ( x )}). unir ( '' ); //2015 //Aquí están, en la consola: consola . log ( '\n2. Conversión de clave Gronsfeld a clave Vizhener:' , '\nGronsfeld_key' , Gronsfeld_key , '\n' + 'a Vizhener_key' , Vizhener_key , '\n' + 'y atrás:' , Gronsfeld_key2 ); //3. Entonces el cifrado-descifrado del cifrado Gronsfeld es un trabajo con el cifrado Vigenère: consola . log ( "\n3. Cifrado Gronsfeld - con clave Vigenère, según tabla Vizhener:" , '\n' + 'm = ' , 'GRONSFELD' , ' - mensaje' , '\n' + 'k= ' , Vizhener_key , '- clave' , '\n' + 'cifrado Gronsfeld - cifrado: ' , Vizhener ( 'GRONSFELD' , Vizhener_key ) //produce IRPSUFFQF - cifrado Beaufort , '\n' + 'cifrado Gronsfeld - descifrado:' , Vizhener ( Vizhener ( 'GRONSFELD' , Vizhener_key ), Vizhener_key , 'descifrar' ) //Da GRONSFELD - desde el cifrado de Beaufort. , '\n' + 'Comparación con el mensaje:' , "(descifrado === m)" , ( Vizhener ( Vizhener ( 'GRONSFELD' , Vizhener_key ), Vizhener_key , 'descifrar' ) === 'GRONSFELD' ) //'GRONSFELD'? true ); //cuatro. Cifrado Vigenère (versión completa): //Parámetros: m - mensaje/texto cifrado, k - clave, modo - consola "cifrar"/"descifrar" . log ( '\n4. Cifrado Vigenère (versión completa):' , '\n' + 'm = ' , m , ' - mensaje' , '\n' + 'k = ' , k , '- clave' , ' \n' + 'cifrado Vigenère - cifrado: ' , Vizhener ( m , k ) //produce LXFOPVEFRNHR - cifrado Vigenère , '\n' + 'cifrado Vigenère - descifrado: ' , Vizhener ( Vizhener ( m , k ), k , 'decrypt' ) // dará ATTACKATDAWN - from Vizhener cipher , '\n' + 'Comparation with message: ' , "( decrypted === m )" , ( Vizhener ( Vizhener ( m , k , 'encrypt' ), k , 'descifrar' ) === m ) //m?true ); //5. El cifrado de Beaufort, a través del cifrado de Vigenère (hay otra tabla y texto cifrado, se desplazó atbash a lo largo de las líneas). //Parámetros: m - clave, k - mensaje/texto cifrado, modo - 'descifrar' (solo descifrar) //La peculiaridad del cifrado Beaufort es que el descifrado es volver a cifrar el texto cifrado, con la misma clave. //Es decir, la misma operación. consola _ log ( "\n5. Cifrado de Beaufort (en la tabla - atbash línea por línea):" , '\n' + 'm = ' , m , ' - mensaje' , '\n' + 'k = ' , k , '- key' , '\n' + 'Beaufort cipher - Cifrado de tabla de Vigenère: ' , Vizhener ( k , m , 'decrypt' ) //produce LLTOLBETLNPR - Cifrado de Beaufort , '\n' + 'Beaufort cipher - Descifrado de tabla de Vigenère :' , Vizhener ( k , Vizhener ( k , m , 'descifrar' ), 'descifrar' ) //dar ATTACKATDAWN - del cifrado Beaufort. , '\n' + 'Comparación con el mensaje: ' , "( descifrado === m )" , ( Vizhener ( k , Vizhener ( k , m , 'descifrar' ), 'descifrar' ) === m ) //m? true ); //6. Atbash desplazado - a través del cifrado Vigenère (hay otra tabla y texto cifrado - atbash, desplazado en filas en columnas). //Parámetros: m o k - mensaje/texto cifrado y clave (o viceversa), modo - 'shifted_atbash' (solo cifrar + atbash al resultado) //No solo es la misma operación (descifrado - hay cifrado del texto cifrado ), pero también es conmutativa. //Es decir, aquí, las enésimas letras (del mensaje/texto cifrado) y la clave - pueden intercambiarse, dando el mismo resultado. //Es precisamente esto, el atbash desplazado - que se acerca al cifrado de Vernam, //porque al descifrar con el cifrado de Vernam, la operación XOR no importa dónde están los bytes de clave y dónde están los bytes de texto cifrado. consola _ log ( "\n6. Atbash desplazado (en la tabla atbash, desplazado tanto filas como columnas):" , '\n' + 'm = ' , m , ' - mensaje' , '\n' + 'k = ' , k , '- key' , '\n' + 'Atbash desplazado - Cifrado de tabla Vigener: ' , Vizhener ( m , k , 'shifted_atbash' ) //Da OCULKEVUIMSI - cifrado atbash desplazado. , 'Prueba de conmutatividad de reemplazo: ' , Vizhener ( k , m , ' shifted_atbash' ) // Lo mismo, sin importar dónde esté la clave y dónde esté el mensaje. , ' \n' + ' Shifted atbash - descifrado usando la tabla Vizhener : / _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ / Lo mismo, no importa dónde esté la clave, sino dónde esté el texto cifrado. , '\n' + 'Comparación con el mensaje: ' , "( descifrado === m )" , ( Vizhener ( k , Vizhener ( k , m , 'shifted_atbash ' ) , ' shifted_atbash ' ) === m ) // m ? _ _ _ _ _ _ _ _ _ ifted_atbash' ) === Visualizador ( k , m , 'shifted_atbash' )) && ( Visualizador ( Visualizador ( k , m , 'shifted_atbash' ), k , 'shifted_atbash' ) === Visualizador ( k , Visualizador ( k , m , 'shifted_atbash' ), 'shifted_atbash' ) ) ) //¿Conmutatividad? verdadero );

Delfos 10

El código programa Vigenère ; utiliza el sistema . SysUtils , Winapi . ventanas ; const cmGronsfeld : Byte = 1 ; cmShiftedAtbash : Byte = 2 ; cmDescifrar : Byte = 4 ; YesNo : matriz [ booleana ] de cadena = ( 'no' , 'sí' ) ; registro de variables : TStringBuilder ; función VigenereCrypt ( m , k : cadena ; modo : Byte = 0 ) : cadena ; constante = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ ' ; //Cadena alfabética var maxLength , i , mi , ki , ix : Integer ; r , ki_s , c : cadena ; gronsfeld , shiftedAtbash , descifrar : booleano ; comenzar //(cifrar/descifrar) para "Gronsfeld" + "Vigenere" + "Beaufort" + "Shifted Atbash" //m - mensaje o texto cifrado (puede ser clave si el cifrado Beaufort), //k - clave (o mensaje/ texto cifrado si el cifrado de Beaufort), //modo - modo: // Cifrar: "cifrar" (predeterminado), // Descifrar: "descifrar" (modo === 'descifrar'), // Cifrar-descifrar por tabla atbash desplazada: (modo = cmShiftedAtbash) // Extrae dígitos de la clave de cifrado de Gronsfeld: "gronsfeld" o "gronsfeld_encrypt", "gronsfeld decrypt". longitud máxima := m . Longitud ; si k . Longitud > maxLength luego maxLength := k . Longitud ; Resultado := '' ; //Resultado vacío gronsfeld := ( modo y cmGronsfeld ) > 0 ; shiftedAtbash := ( modo y cmShiftedAtbash ) > 0 ; descifrar := ( modo y cmDecrypt ) > 0 ; for i := 0 to maxlength - 1 do begin //cifrar/descifrar //Vigenere - cifrar/descifrar una fórmula (cifrar - por defecto; descifrar - cuando (cmDecrypt está en modo) ) //ajustar mensaje/texto cifrado - a clave (si es menor) si i >= m . longitud entonces ix := i mod m . Longitud más ix := i ; mi := un . IndexOf ( m [ ix + 1 ]) ; si yo >= k . longitud entonces ix := i mod k . Longitud más ix := i ; ki_s := k [ ix + 1 ] ; // ajusta la clave al mensaje/texto cifrado (si es breve) if gronsfeld then ki := ki_s . ToInteger () más ki := a . Índice de ( ki_s ) ; //resta durante el descifrado o suma. si se descifra entonces ki := ki * - 1 ; c := a [(( a . Longitud + mi + ki ) mod a . Longitud ) + 1 ] ; //símbolo según la tabla de Vigenère. si shiftedAtbash entonces c := a [ a . longitud - un . índice de ( c )] ; // Atbash personaje o personaje. Resultado := Resultado + c ; //Agregue un caracter al resultado. fin ; fin ; función GronsfeldToVigenere ( GfKey : cadena ) : cadena ; constante = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ ' ; //Cadena alfabética var i : Integer ; comenzar Resultado := '' ; for i := 1 to Longitud ( GfKey ) do Result := Result + a [ StrToInt ( GfKey [ i ]) + 1 ] ; fin ; función VigenereToGronsfeld ( VgKey : cadena ) : cadena ; constante = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ ' ; //Cadena alfabética var i : Integer ; comenzar Resultado := '' ; for i := 1 a Longitud ( VgKey ) do Result := Result + IntToStr ( a . indexOf ( VgKey [ i ])) ; // Fin de 2015 ; procedimiento GronsfeldTest () ; const MENSAJE = ' GRONSFELD ' ; CLAVE = '2015' ; TXTO = '1. Cifrado Gronsfeld (Versión simplificada del cifrado Vigenère con clave digital):' #13#10 + 'Mensaje:' #9 '"%s"' #13#10 + 'Clave:' #9#9 '"%s"' # 13#10 + 'Cifrado:' #9 '"%s" (debe ser "IRPSUFFQF")' #13#10 + 'Descifrado:' #9 '"%s" (debe ser "%s")' # 13 #10 + 'Coincidencia:' #9 '%s' #13#10 ; var encriptado , desencriptado : cadena ; inicio //1. Cifrado de Gronsfeld. (Una versión truncada del cifrado Vigenère). //Parámetros: m - mensaje/texto cifrado, k - clave (solo números), modo - "cifrar/descifrar" encriptado := VigenereCrypt ( MSG , CLAVE , cmGronsfeld ) ; //da cifrado IRPSUFFQF-Gronsfeld descifrado := VigenereCrypt ( crypted , KEY , cmGronsfeld o cmDecrypt ) ; //da GRONSFELD - del cifrado Gronsfeld registro _ AppendFormat ( TXT , [ MSG , KEY , crypted , decrypted , MSG , YesNo [ descrypted = MSG ]]) ; fin ; procedimiento VigenereToGronsfeldTest () ; const GKEY = '2015' ; TXTO = #13# 10'2. Conversión de clave Gronsfeld a clave Vigenère:' #13#10 + 'clave Gronsfeld: "%s" >>> clave Vigenère: "%s" y viceversa: "%s"' #13#10 ; var GronsfeldKey2 : cadena ; VigenereKey : cadena _ empezar //2. Además, en lugar de números, en el cifrado de Gronsfeld también es posible indicar letras. //Entonces, el cifrado Gronsfeld será un cifrado Vigenère regular, pero con un límite de caracteres por clave. //Por ejemplo, con todos los dígitos posibles en la clave "0123456789", la clave solo puede ser de las letras "ABCDEFGHIJ" //Puede obtenerla así: VigenereKey := GronsfeldToVigenere ( GKEY ) ; //CABF //Y viceversa: GronsfeldKey2 := VigenereToGronsfeld ( VigenereKey ) ; //2015 registro _ AppendFormat ( TXT , [ GKEY , VigenereKey , GronsfeldKey2 ]) ; fin ; procedimiento GronsfeldAsVigenereTest () ; const MENSAJE = ' GRONSFELD ' ; CLAVE = 'CABF' ; TXTO = #13# 10'3. Cifrado Gronsfeld - con clave Vigenère, según tabla Vigenère:' #13#10 + 'Mensaje:' #9 '"%s"' #13#10 + 'Clave:' #9#9 '"%s"' # 13 #10 + 'Cifrado:' #9 '"%s" (debe ser "IRPSUFFQF")' #13#10 + 'Descifrado:' #9 '"%s" (debe ser "%s")' #13 # 10 + 'Coincidencia:' #9 '%s' #13#10 ; var encriptado , desencriptado : cadena ; empezar //3. Entonces el cifrado-descifrado del cifrado Gronsfeld es un trabajo con el cifrado Vigenère: encriptado := VigenereCrypt ( MSG , CLAVE ) ; //da cifrado IRPSUFFQF-Beaufort descifrado := VigenereCrypt ( crypted , KEY , cmDecrypt ) ; //da GRONSFELD - del cifrado de Beaufort. registro _ AppendFormat ( TXT , [ MSG , KEY , crypted , decrypted , MSG , YesNo [ descrypted = MSG ]]) ; fin ; procedimiento VigenereFullTest () ; const MSG = 'ATAQUE AL AMANECER' ; //Mensaje CLAVE = 'LIMÓN' ; //Clave TXT = #13#10 '4. Cifrado Vigenère (versión completa):' #13#10 + 'Mensaje:' #9 '"%s"' #13#10 + 'Clave:' #9#9 '"%s"' #13#10 + ' Cifrado:' #9 '"%s" (debe ser "LXFOPVEFRNHR")' #13#10 + 'Descifrado:' #9 '"%s" (debe ser "%s")' #13#10 + 'Coincidir :' #9 '%s' #13#10 ; var encriptado , desencriptado : cadena ; empezar //4. Cifrado de Vigenère (versión completa): //Parámetros: m - mensaje/texto cifrado, k - clave, modo - "cifrar"/"descifrar" encriptado := VigenereCrypt ( MSG , CLAVE ) ; //da LXFOPVEFRNHR-Cifrado Vigenere descifrado := VigenereCrypt ( crypted , KEY , cmDecrypt ) ; // da ATTACKATDAWN - del cifrado Vigenère registro _ AppendFormat ( TXT , [ MSG , KEY , crypted , decrypted , MSG , YesNo [ descrypted = MSG ]]) ; fin ; procedimiento BeaufortTest () ; const MSG = 'ATAQUE AL AMANECER' ; //Mensaje CLAVE = 'LIMÓN' ; //Clave TXT = #13#10 '5. Cifrado Beaufort (en la tabla - atbash línea por línea):' #13#10 + 'Mensaje:' #9 '"%s"' #13#10 + 'Clave:' #9#9 '"%s"' #13 # 10 + 'Cifrado Vigenère de Beaufort:' #13#10 + 'Cifrado:' #9 '"%s" (debería ser "LLTOLBETLNPR")' #13#10 + 'Descifrado:' #9 '"%s " (debería ser "%s")' #13#10 + 'Coincidencia:' #9 '%s' #13#10 ; var encriptado , desencriptado : cadena ; comenzar //5. El cifrado de Beaufort, a través del cifrado de Vigenère (hay otra tabla y texto cifrado, se desplazó atbash a lo largo de las líneas). //Parámetros: m - clave, k - mensaje/texto cifrado, modo - 'descifrar' (solo descifrar) //La peculiaridad del cifrado Beaufort es que el descifrado es volver a cifrar el texto cifrado, con la misma clave. //Es decir, la misma operación. encriptado := VigenereCrypt ( CLAVE , MSG , cmDecrypt ) ; //da LLTOLBETLNPR-cifrado Beaufort descifrado := VigenereCrypt ( CLAVE , encriptado , cmDecrypt ) ; // da ATTACKATDAWN - del cifrado de Beaufort. registro _ AppendFormat ( TXT , [ MSG , KEY , crypted , decrypted , MSG , YesNo [ descrypted = MSG ]]) ; fin ; procedimiento ShiftedAtbashTest () ; const MSG = 'ATAQUE AL AMANECER' ; //Mensaje CLAVE = 'LIMÓN' ; //Clave TXT = #13#10 '6. Atbash desplazado (en la tabla atbash, desplazado tanto filas como columnas):' #13#10 + 'Mensaje:' #9 '"%s"' #13#10 + 'Tecla:' #9#9 '"% s "' #13#10 + 'Atbash desplazado - Cifrado de tabla Vigenère:' #9 '"%s" (debería ser "OCULKEVUIMSI")' #13#10 + 'Prueba de conmutatividad de reemplazo:' #9 '"%s" ( debería ser "OCULKEVUIMSI")' #13#10 + 'Atbash desplazado - Descifrado de Vigenère:' #9 '"%s" (debería ser "ATTACKATDAWN")' #13#10 + 'Prueba de conmutatividad de reemplazo:' #9 '" %s"' #13#10 + 'Comparación con mensaje:' #9 '%s' #13#10 + 'Conmutatividad de reemplazo:' #9 '%s' ; var csaMK , csaKM , csaKMK , csaKKM : cadena ; empezar //6. Atbash desplazado - a través del cifrado Vigenère (hay otra tabla y texto cifrado - atbash, desplazado en filas en columnas). //Parámetros: m o k - mensaje/texto cifrado y clave (o viceversa), modo - cmShiftedAtbash (solo cifrar + atbash al resultado) //No solo es la misma operación (descifrado - hay cifrado del texto cifrado), pero a Además, también es conmutativo. //Es decir, aquí, las enésimas letras (del mensaje/texto cifrado) y la clave - pueden intercambiarse, dando el mismo resultado. //Es precisamente esto, el atbash desplazado - que se acerca al cifrado de Vernam, //porque al descifrar con el cifrado de Vernam, la operación XOR no importa dónde están los bytes de clave y dónde están los bytes de texto cifrado. csaMK := VigenereCrypt ( MSG , CLAVE , cmShiftedAtbash ) ; // da OCULKEVUIMSI - cifrado atbash desplazado. csaKM := VigenereCrypt ( CLAVE , MSG , cmShiftedAtbash ) ; //Lo mismo, no importa donde esta la llave, sino donde esta el mensaje. csaKMK := VigenereCrypt ( csaKM , CLAVE , cmShiftedAtbash ) ; // da ATTACKATDAWN - del cifrado atbash cambiado. csaKKM := VigenereCrypt ( CLAVE , csaKM , cmShiftedAtbash ) ; //Lo mismo, no importa donde esta la clave, sino donde esta el texto cifrado. registro _ AppendFormat ( TXT , [ MSG , KEY , csaMK , csaKM , csaKMK , csaKKM , YesNo [ csaKKM = MSG ] , YesNo [( csaMK = csaKM ) y ( csaKMK = csaKKM )]]) ; fin ; iniciar registro := TStringBuilder . crear () ; prueba //Pruebas: GronsfeldTest () ; VigenereToGronsfeldTest () ; GronsfeldAsVigenereTest () ; VigenereFullTest () ; Prueba de Beaufort () ; ShiftedAtbashTest () ; MessageBoxW ( GetDesktopWindow () , PWideChar ( log . ToString ()) , 'Vigenère' , 0 ) ; finalmente registro . libre () ; fin ; fin _

Rubí

El código clase Crypto class CryptoError < StandardError ; uno mismo ; final attr_reader :alfabeto # acepta una matriz arbitraria de caracteres únicos, puede ser uno o más idiomas, letras minúsculas latinas predeterminadas def initialize ( alphabet = ( 'A' .. 'Z' ) . to_a ) @alphabet = alphabet check_alphabet end # c{j}=(m{j}+k{j}) mod {n} def codificar ( key_str , text_srt ) key_arr = str_to_alphabet_index_arr ( key_str ) char_number_at_text = 0 str_to_alphabet_index_arr ( text_srt ) . inyectar ( "" ) hacer | r , índice_letra | encode_letter_index = ( letter_index + key_arr [ char_number_at_text % key_arr . size ] ) % alfabeto . tamaño char_number_at_text += 1 r + alfabeto [ encode_letter_index ] final final # m{j}=(c{j} + n - k{j}) mod {n} def decodificar ( key_str , text_srt ) key_arr = str_to_alphabet_index_arr ( key_str ) char_number_at_text = 0 str_to_alphabet_index_arr ( text_srt ) . inyectar ( "" ) hacer | r , índice_letra | decode_letter_index = ( letra_índice + alfabeto . tamaño - key_arr [ char_number_at_text % key_arr . tamaño ] ) % alfabeto . tamaño char_number_at_text += 1 r + alfabeto [ decode_letter_index ] final final privado def str_to_alphabet_index_arr ( str ) str . caracteres _ hacer mapa | carbón | índice = alfabeto . index ( char ) si el índice index else genera CryptoError , ' las letras deben estar en el alfabeto' end end end def check_alphabet aumentar CryptoError , 'el alfabeto debe ser una matriz' a menos que sea un alfabeto . ¿es un? ( Array ) genera CryptoError , ' las letras deben ser cadenas' si es un alfabeto . ¿ningún? { | letras | ! carta _ ¿es un? ( String ) } generar CryptoError , 'el alfabeto debe contener al menos una letra' if alphabet . tamaño < 1 plantea CryptoError , 'las letras deben ser únicas' si es alfabeto . único _ tamaño != alfabeto . aumentar el tamaño CryptoError , 'la letra no debe estar en blanco' si es un alfabeto . ¿ningún? ( & : ¿vacío? ) generar CryptoError , 'las letras deben contener solo un carácter' si el alfabeto . ¿ningún? { | letras | carta _ tamaño != 1 } final final # ejemplos crypto = Crypto . criptografía nueva . codificar ( 'LEMON' , 'ATTACKATDAWN' ) # "LXFOPVEFRNHR" crypto . decodificar ( 'LEMON' , 'LXFOPVEFRNHR' ) # "ATTACKATDAWN" crypto . codificar ( 'LEMON' , 'ataque' ) # Crypto::CryptoError: las letras deben estar en el alfabeto eng_crypto = Cripto . nuevo (( 'A' .. 'I' ) . to_a ) rus_crypto . codificar ( 'KVAS' , 'MAMAMYLARAMU' ) # "TSVMSTSELS™VMD" rus_crypto . decodificar ( 'KVAS' , ' TSVMTSELS™VMD' ) # "MAMAMYLARAMU"

Notas

  1. ↑ Martin , Keith M. Criptografía cotidiana  . — Oxford University Press, 2012. — pág. 142 págs. — ISBN 978-0-19-162588-6 .
  2. Matemáticas discretas: algoritmos. Reseña histórica (enlace inaccesible) . lluvia.ifmo.ru Consultado el 22 de diciembre de 2017. Archivado desde el original el 21 de diciembre de 2017. 
  3. Serguéi y Marina Bondarenko . Cifrados del pasado: criptografía y misterios de la era anterior a la computadora  (ruso) , 3DNews - Daily Digital Digest  (8 de julio de 2015). Consultado el 22 de diciembre de 2017.
  4. ↑ 1 2 3 4 5 6 7 Babash AV, Shankin G.P. Historia de la criptografía. Parte I. - M.: Helios ARV, 2002. - S. 240 p.. - ISBN 5854380439 .
  5. Smith, Laurence D. Cifrados de sustitución // Criptografía: la ciencia de la escritura secreta: La ciencia de la  escritura secreta . - Publicaciones de Dover , 1943. - Pág. 81. - ISBN 0-486-20247-X .
  6. ↑ 1 2 Nosov V. A. Breve bosquejo histórico del desarrollo de la criptografía  (ruso)  // Universidad de Moscú y el desarrollo de la criptografía en Rusia. Materiales de la conferencia en la Universidad Estatal de Moscú .. - (17 de octubre de 2002).
  7. ↑ 1 2 3 David, Kahn. Los descifradores: la historia de la escritura secreta. - Simon & Schuster, 1999. - ISBN 0-684-83130-9 .
  8. Knudsen, Lars R. Block Ciphers: una encuesta. - Londres: Springer, 1997. - ISBN 3-540-65474-7 .
  9. Stanislav Jarecki. Descripción general de Crypto, Perfect Secrecy, One-time Pad  // Universidad de California. — 2004.
  10. Richard A. Mollin. Códigos: la guía del secreto desde la antigüedad hasta los tiempos modernos. - Chapman y Hall/CRC, 2005. - 704 páginas p. — ISBN 9781584884705 .
  11. Zhelnikov V. Criptografía del papiro a la computadora - M .: ABF , 1996. - 336 p. — ISBN 978-5-87484-054-9
  12. Singh S. El libro de códigos: la ciencia del secreto desde el antiguo Egipto hasta la criptografía cuántica. - Ciudad de Nueva York: Doubleday, 1999. - 416 p. Con. - ISBN 978-1-85702-879-9 .
  13. Ejercicio de laboratorio: Vigenere, RSA, DES y protocolos de autenticación  // CS 415: Seguridad informática y de redes. - 2006. Archivado el 23 de julio de 2011.
  14. Arto Salomaa. Criptografía de clave pública. — ISBN 3540528318 .

Literatura

  • Romankov V.A. Introducción a la criptografía: curso de conferencias, 2009. - 238 p. - ISBN 5777909825 .
  • Babash A. V., Shankin G. P. Historia de la criptografía. Parte I. - M.: Helios ARV, 2002. - 240 p. — ISBN 5854380439 .
  • Zhelnikov V. Criptografía del papiro a la computadora - M .: ABF , 1996. - 336 p. — ISBN 978-5-87484-054-9
  • Arto Salomaa. Criptografía de clave pública. — ISBN 3540528318 .
  • N inteligente. Criptografía.. - Moscú: Technosfera, 2005. - 528 p. - ISBN 5-94836-043-1 .
  • Singh S. The Code Book , Histoire des codes secrets  (inglés) : The Science of Secrecy from Ancient Egypt to Quantum Cryptography, De l'Égypte des pharaons à l'ordinateur quantique - NYC : Doubleday , Knopf Doubleday Publishing Group , 1999. — 416 pág.
  • Richard A. Mollín. Códigos: la guía del secreto desde la antigüedad hasta los tiempos modernos. - Chapman y Hall/CRC, 2005. - 704 páginas p. — ISBN 9781584884705 .
  • Martin, Keith M. Criptografía cotidiana. - Oxford University Press, 2012. - 142 p. — ISBN 978-0-19-162588-6
  • Knudsen, Lars R. Block Ciphers: una encuesta. - Londres: Springer, 1997. - ISBN 3-540-65474-7 .
  • Henk Ca van Tilborg. Enciclopedia de Criptografía y Seguridad. - Springer, 2005. - 115 págs. — ISBN 038723473X .
  • Arto Salomaa. Criptografía de clave pública. — ISBN 3540528318 .

Enlaces