índice
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)
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
Descriptografar:
Função de descriptografia:
encontre o inverso multiplicativo de a como 15
D (x) = 15 (x-3) (mod 26)
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)