Cifrado y descifrado de cifrados afines

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)
Inserte la descripción de la imagen aquí

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
Inserte la descripción de la imagen aquí

Descifrar:

Función de descifrado:
Encuentre el inverso multiplicativo de a como 15
D (x) = 15 (x-3) (mod 26)
Inserte la descripción de la imagen aquí

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)

Supongo que te gusta

Origin blog.csdn.net/Pioo_/article/details/110235362
Recomendado
Clasificación