Rutas
/
Scheme
Scheme
/
Ejercicios
/
Cifrado afín
Cifrado afín

Cifrado afín

Media

Instrucciones

Crea una implementación del cifrado afín, un antiguo sistema de cifrado creado en Oriente Medio.

El cifrado afín es un tipo de cifrado de sustitución monoalfabético. Cada carácter se asigna a su equivalente numérico, se cifra con una función matemática y luego se convierte en la letra correspondiente a su nuevo valor numérico. Aunque todos los cifrados monoalfabéticos son débiles, el cifrado afín es mucho más fuerte que el cifrado Atbash, porque tiene muchas más claves.

Cifrado

La función de cifrado es:

E(x) = (ai + b) mod m

Donde:

  • i es el índice de la letra, de 0 a la longitud del alfabeto - 1.
  • m es la longitud del alfabeto. Para el alfabeto romano, m es 26.
  • a y b son números enteros que forman la clave de cifrado.

Los valores a y m deben ser coprimos (o primos relativos) para que el descifrado automático funcione, es decir, deben tener el número 1 como único factor común (puedes encontrar más información en el artículo de Wikipedia sobre números enteros coprimos). En caso de que a no sea coprimo con m, tu programa debería indicar que se trata de un error. De lo contrario, debería cifrar o descifrar con la clave proporcionada.

Para este ejercicio, los dígitos son una entrada válida, pero no se cifran. Los espacios y los signos de puntuación se excluyen. El texto cifrado se escribe en grupos de longitud fija separados por espacios; el tamaño de grupo tradicional es de 5 letras. Esto sirve para dificultar la adivinación del texto cifrado a partir de los límites de las palabras.

Descifrado

La función de descifrado es:

D(y) = (a^-1)(y - b) mod m

Donde:

  • y es el valor numérico de una letra cifrada, es decir, y = E(x)
  • es importante tener en cuenta que a^-1 es el inverso multiplicativo modular (IMM) de a mod m
  • el inverso multiplicativo modular solo existe si a y m son coprimos.

El IMM de a es x de forma que el residuo de dividir ax entre m sea 1:

ax mod m = 1

Puedes encontrar más información sobre cómo hallar un inverso multiplicativo modular y qué significa en el artículo de Wikipedia correspondiente.

Ejemplos generales

  • Cifrar "test" da "ybty" con la clave a = 5, b = 7
  • Descifrar "ybty" da "test" con la clave a = 5, b = 7
  • Descifrar "ybty" da "lqul" con la clave incorrecta a = 11, b = 7
  • Descifrar "kqlfd jzvgy tpaet icdhm rtwly kqlon ubstx" da "thequickbrownfoxjumpsoverthelazydog" con la clave a = 19, b = 13
  • Cifrar "test" con la clave a = 18, b = 13 es un error porque 18 y 26 no son coprimos

Ejemplo de cómo hallar un inverso multiplicativo modular (IMM)

Hallar el IMM para a = 15:

  • (15 * x) mod 26 = 1
  • (15 * 7) mod 26 = 1, es decir, 105 mod 26 = 1
  • 7 es el IMM de 15 mod 26

Fuente

WikipediaEl enlace se abre en una nueva ventana o pestaña
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Scheme Exercism

¿Listo para empezar Cifrado afín?

Regístrate en Exercism para aprender y dominar Scheme con 39 ejercicios y mentoría humana real, todo gratis.