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 corresponde con un equivalente numérico, que se cifra con una función matemática y después 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.
La función de cifrado es:
E(x) = (ai + b) mod m
Donde:
i es el índice de la letra, desde 0 hasta la longitud del alfabeto menos 1.m es la longitud del alfabeto.
Para el alfabeto latino, 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 entre sí) para que el descifrado automático tenga éxito, 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 coprimos).
Si a no es coprimo con m, tu programa debe indicar que se trata de un error.
En caso contrario, debe cifrar o descifrar con la clave proporcionada.
A efectos de 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, y el tamaño de grupo tradicional es de 5 letras.
Esto dificulta adivinar el texto cifrado a partir de los límites entre palabras.
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)
a^-1 es el inverso multiplicativo modular (IMM) de a mod m
a y m son coprimos.El IMM de a es x, tal que el residuo de dividir ax entre m es 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 relacionado de Wikipedia.
"test" da "ybty" con la clave a = 5, b = 7
"ybty" da "test" con la clave a = 5, b = 7
"ybty" da "lqul" con la clave incorrecta a = 11, b = 7
"kqlfd jzvgy tpaet icdhm rtwly kqlon ubstx" da "thequickbrownfoxjumpsoverthelazydog" con la clave a = 19, b = 13
"test" con la clave a = 18, b = 13 es un error porque 18 y 26 no son coprimosHallar 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
Regístrate en Exercism para aprender y dominar 8th con 70 ejercicios y mentoría humana real, todo gratis.