Criptografia e descriptografia de cifras afins

Introdução

A cifra afim é um tipo de criptografia de tabela única. Todas as letras do sistema alfabético são criptografadas por uma equação matemática simples, correspondendo a valores numéricos ou de volta às letras. É uma senha de substituição que usa funções de criptografia para criptografar uma letra para uma letra.

Espaço chave

O conjunto de caracteres m geralmente é 26

mdc (a, m) = 1, então o espaço de valor de a é φ (m) = 12,

b∈ [0,26)

O espaço-chave é 26 × 12 = 312, então ele pode ser atacado apenas quando parte do texto simples é conhecido!

Função de criptografia

A função de criptografia é E (x) = (ax + b) (mod m) , onde a e m são relativamente primos e m é o tamanho do conjunto de caracteres.
(Por exemplo, 26 significa 26 letras como código. Quando m é 26, a deve ser 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25)
Insira a descrição da imagem aqui

Função de descriptografia

A função de descriptografia é D (x) = a ^ -1 (x-b) (mod m), onde a-1 é o inverso multiplicativo de a no grupo Zm.
É fácil derivar da função de criptografia:

a⋅x + b ≡ y mod m
a⋅x ≡ (y − b) mod m
x ≡ a ^ −1 ⋅ (y − b) mod m

Multiplicativo inverso

Qualquer elemento a no grupo G possui um único elemento inverso a` em G, com a propriedade aa` = a`a = e, onde e é o elemento identidade do grupo.
Por exemplo: 7 * 15 = 1 mod 26
15 é o elemento inverso multiplicativo de 7.

exemplo

Assumindo que a chave K = (7,3), use o criptosistema afim para criptografar a palavra quente e descriptografar o texto cifrado obtido.

criptografia:

Função de criptografia: E (x) = (7x + 3) (mod 26)
Obtenha X de acordo com a tabela de codificação de letras em inglês acima
Insira a descrição da imagem aqui

Descriptografar:

Função de descriptografia:
encontre o inverso multiplicativo de a como 15
D (x) = 15 (x-3) (mod 26)
Insira a descrição da imagem aqui

Código (versão 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)

Acho que você gosta

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