stringtranslate.com

Cifrado afín

El cifrado afín es un tipo de cifrado de sustitución monoalfabético , en el que cada letra de un alfabeto se asigna a su equivalente numérico, se cifra mediante una función matemática simple y se convierte nuevamente en una letra. La fórmula utilizada significa que cada letra se cifra en otra letra y viceversa, lo que significa que el cifrado es esencialmente un cifrado de sustitución estándar con una regla que rige qué letra va a cuál. Como tal, tiene las debilidades de todos los cifrados de sustitución. Cada letra se cifra con la función ( ax + b ) mod 26 , donde b es la magnitud del desplazamiento.

Descripción

Aquí, las letras de un alfabeto de tamaño m se asignan primero a los números enteros en el rango 0 ... m − 1 . Luego, utiliza aritmética modular para transformar el número entero al que corresponde cada letra de texto simple en otro número entero que corresponde a una letra de texto cifrado. La función de cifrado para una sola letra es

donde el módulo m es el tamaño del alfabeto y a y b son las claves del cifrado. El valor a debe elegirse de manera que a y m sean coprimos . La función de descifrado es

donde a −1 es el inverso multiplicativo modular de a módulo m . Es decir, satisface la ecuación

El inverso multiplicativo de a solo existe si a y m son coprimos. Por lo tanto, sin la restricción de a , el descifrado podría no ser posible. Se puede demostrar de la siguiente manera que la función de descifrado es la inversa de la función de cifrado,

Debilidades

Dado que el cifrado afín sigue siendo un cifrado de sustitución monoalfabético, hereda las debilidades de esa clase de cifrados. El cifrado César es un cifrado afín con a = 1, ya que la función de cifrado simplemente se reduce a un desplazamiento lineal. El cifrado Atbash utiliza a = −1 .

Considerando el caso específico de cifrado de mensajes en inglés (es decir, m = 26 ), hay un total de 286 cifrados afines no triviales, sin contar los 26 cifrados César triviales. Este número proviene del hecho de que hay 12 números que son coprimos con 26 que son menores que 26 (estos son los valores posibles de a ). Cada valor de a puede tener 26 cambios de adición diferentes (el valor b ); por lo tanto, hay 12 × 26 o 312 claves posibles. Esta falta de variedad hace que el sistema sea altamente inseguro cuando se considera a la luz del Principio de Kerckhoff .

La principal debilidad del cifrado proviene del hecho de que si el criptoanalista puede descubrir (mediante análisis de frecuencia , fuerza bruta , adivinación o de otra manera) el texto simple de dos caracteres cifrados, entonces la clave se puede obtener resolviendo una ecuación simultánea . Como sabemos que a y m son primos entre sí, esto se puede utilizar para descartar rápidamente muchas claves "falsas" en un sistema automatizado.

El mismo tipo de transformación que se utiliza en los cifrados afines se utiliza en los generadores congruenciales lineales , un tipo de generador de números pseudoaleatorios . Este generador no es un generador de números pseudoaleatorios criptográficamente seguro por la misma razón por la que el cifrado afín no es seguro.

Ejemplo

En este ejemplo que muestra el cifrado y descifrado, el alfabeto será las letras de la A a la Z, y tendrán los valores correspondientes que se encuentran en la siguiente tabla.

Encriptación

En este ejemplo de cifrado, [1] el texto simple que se va a cifrar es "AFFINE CIPHER" utilizando la tabla mencionada anteriormente para los valores numéricos de cada letra, tomando a como 5, b como 8 y m como 26 ya que hay 26 caracteres en el alfabeto que se utiliza. Solo el valor de a tiene una restricción ya que tiene que ser coprimo con 26. Los posibles valores que a podría tener son 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23 y 25. El valor de b puede ser arbitrario siempre que a no sea igual a 1 ya que este es el desplazamiento del cifrado. Por lo tanto, la función de cifrado para este ejemplo será y = E ( x ) = (5 x + 8) mod 26 . El primer paso para cifrar el mensaje es escribir los valores numéricos de cada letra.

Ahora, tome cada valor de x y resuelva la primera parte de la ecuación, (5 x + 8) . Después de encontrar el valor de (5 x + 8) para cada carácter, tome el resto al dividir el resultado de (5 x + 8) por 26. La siguiente tabla muestra los primeros cuatro pasos del proceso de cifrado.

El paso final para cifrar el mensaje es buscar en la tabla las letras correspondientes a cada valor numérico. En este ejemplo, el texto cifrado sería IHHWVCSWFRCP. La tabla siguiente muestra la tabla completa para cifrar un mensaje en el cifrado Affine.

Descifrado

En este ejemplo de descifrado, el texto cifrado que se descifrará es el texto cifrado del ejemplo de cifrado. La función de descifrado correspondiente es D ( y ) = 21( y − b) mod 26 , donde a −1 se calcula como 21 y b es 8. Para comenzar, escriba los equivalentes numéricos de cada letra del texto cifrado, como se muestra en la siguiente tabla.

Ahora, el siguiente paso es calcular 21( y − 8) y luego tomar el resto cuando ese resultado se divide por 26. La siguiente tabla muestra los resultados de ambos cálculos.

El paso final para descifrar el texto cifrado es utilizar la tabla para convertir los valores numéricos en letras. El texto sin formato de este descifrado es AFFINECIPHER. A continuación se muestra la tabla con el paso final completado.

Alfabeto completo codificado

Para que el cifrado y el descifrado sean más rápidos, se puede cifrar todo el alfabeto para crear un mapa uno a uno entre las letras del texto sin formato y el texto cifrado. En este ejemplo, el mapa uno a uno sería el siguiente:

Ejemplos de programación

El siguiente código Python se puede utilizar para cifrar texto con el cifrado afín:

# Imprime una tabla de transposición para un cifrado afín. def  affine ( a :  int ,  b :  int ,  s :  str ):  import  string D  =  dict ( enumerate ( string . ascii_lowercase ,  start = 0 ))  E  =  { v :  k  para  k , v  en  D . items ()}  tamaño  =  len ( string . ascii_lowercase )  ret  =  ""  print ( tamaño )  para  c  en  s :  N  =  E [ c ]  val  =  a  *  N  +  b  val  =  val  %  tamaño  print ( f " { c } ( { N } ) -> { D [ val ] } ( { val } )" )  ret  +=  D [ val ]  return  retafín ( 7 ,  3 ,  'foobar' )

Véase también

Referencias

  1. ^ Kozdron, Michael. "Cifrados afines" (PDF) . Consultado el 22 de abril de 2014 .