仿射密码
加密过程:
C
=
E
(
m
)
=
(
k
1
∗
m
+
k
2
)
m
o
d
n
C = E(m) = (k1 * m + k2) mod n
C=E(m)=(k1∗m+k2)modn
解密过程:
m
=
D
(
C
)
=
(
(
C
−
k
2
)
∗
(
k
1
的逆
)
)
m
o
d
n
m = D(C) = ((C - k2) * (k1的逆)) mod n
m=D(C)=((C−k2)∗(k1的逆))modn
其中:
- C 是加密后的密文。
- m 是待加密的明文。
- k1 和 k2 是仿射密码的两个密钥,它们都是0到n-1之间的整数。
- n 是字母系统的数量,例如对于英文字母系统,n = 26。
- k1的逆 是k1在模n乘法群中的逆元,即存在一个整数k3,使得 (k3 * k1) mod n = 1。
仿射密码的加密和解密过程都依赖于模n运算,以确保结果始终在0到n-1的范围内。另外,为了保证解密过程能够成功进行,k1和n必须互质(即它们的最大公约数为1)。
import math
# 定义
c = '' #加密后的字符串
m = '' #解密后的字符串
word = '' #输入的字符串
n = '' #模
k1, k2 = 0, 0 #两个密钥
if __name__ == '__main__':
k1, k2 = int(input("请输入密钥k1: ")), int(input("请输入密钥k2: "))
n = int(input("请输入模:"))
word = input("请输入加解密的字符串:")
def encode():#加密
global k1, k2, c, word
if math.gcd(n, k1) == 1:
for i in word:
c += chr(((k1 * (ord(i) - 97) + k2) % n) + 97)
print("加密为:", c)
return 0
else:
print("加密失败k1与26不互素!")
return 0
while (encode()):
k1 = int(input("请输入密钥k1: "))
k2 = int(input("请输入密钥k2: "))
def niyuan():#逆元
k3 = 1
while (k1 * k3) % 26 != 1:
k3 += 1
return k3
def decode():#解密
global m, k2, n, word
ni = niyuan()
if ni != 0:
for i in c:
m += chr(ni * (ord(i) - 97 - k2) % n + 97)
print("解密为:", m)
return 0
else:
print("解密失败k1与n没有逆元!")
return 0
while (decode()):
k1 = int(input("请输入密钥k1: "))
k0 = int(input("请输入密钥k2: "))