Tabla de contenido
Introducción
El cifrado afín es un tipo de cifrado de una sola tabla. Todas las letras del sistema alfabético se cifran mediante una ecuación matemática simple, correspondiente a valores numéricos o de nuevo a letras. Es una contraseña de reemplazo que utiliza funciones de cifrado para cifrar una letra a una letra.
Espacio clave
El juego de caracteres m suele ser 26
mcd (a, m) = 1, entonces el espacio de valores de a es φ (m) = 12,
b∈ [0,26)
El espacio clave es 26 × 12 = 312, por lo que solo se puede atacar cuando se conoce parte del texto sin formato.
Función de encriptación
La función de cifrado es E (x) = (ax + b) (mod m) , donde a y m son primos relativos y m es el tamaño del juego de caracteres.
(Por ejemplo, 26 significa 26 letras como código. Cuando m es 26, a debe ser uno de 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25)
Función de descifrado
La función de descifrado es D (x) = a ^ -1 (x-b) (mod m), donde a-1 es el inverso multiplicativo de a en el grupo Zm.
Es fácil derivar de la función de cifrado:
a⋅x + b ≡ y mod m
a⋅x ≡ (y − b) mode m
x ≡ a ^ −1 ⋅ (y − b) mode m
Multiplicación inversa
Cualquier elemento a en el grupo G tiene un elemento inverso único a` en G, con la propiedad aa` = a`a = e, donde e es el elemento de identidad del grupo.
Por ejemplo: 7 * 15 = 1 mod 26
15 es el elemento inverso multiplicativo de 7.
ejemplo
Suponiendo que la clave K = (7,3), utilice el criptosistema afín para cifrar la palabra caliente y descifrar el texto cifrado obtenido.
cifrado:
Función de cifrado: E (x) = (7x + 3) (mod 26)
Obtenga X de acuerdo con la tabla de codificación de letras en inglés anterior
Descifrar:
Función de descifrado:
Encuentre el inverso multiplicativo de a como 15
D (x) = 15 (x-3) (mod 26)
Código (versión de Python)
'''
仿射密码K = (a,b)
加密函数是E(x)= (ax + b) (mod 26)
解密函数为D(x) = (a^-1)(x - b) (mod 26),其中a^-1是a的乘法逆元
'''
# 加密
def enc(a, b, e):
c = []
for i in e:
temp = ((ord(i) - 97) * a + b) % 26 + 97 # a的ascii码是97
c.append(chr(temp))
print(''.join(c).upper())
# 遍历得到a的乘法逆元
def get_multiplicative_inverse(a):
for i in range(1, 27):
if a * i % 26 == 1:
return i
# 解密
def dec(a, b, d):
a_mul_inv = get_multiplicative_inverse(a)
p = []
for i in d:
temp = (((ord(i) - 97) - b) * a_mul_inv) % 26 + 97
p.append(chr(temp))
print(''.join(p).upper())
if __name__ == "__main__":
a, b = 7, 3
e = 'hot'
# d = 'axg'
enc(a, b, e)
# dec(a, b, d)