加密公式:c = Ea,b(m)≡am+b(mod 26)
解密公式:m = Da,b©≡a^(-1)(c-b)(mod 26)
其中a,b是密钥,为满足0<=a,b<=25和gcd(a,26)=1的整数。其中gcd(a,26)表示a和26的最大公因子,gcd(a,26)=1表示a和26是互素的,a^(-1) 表示a的逆元,即a^(-1)*a≡1 mod 26
把英文字母和十进制数字的对应关系存进一个数组中
L = [‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’,‘k’,‘l’,‘m’,‘n’,‘o’,‘p’,‘q’,‘r’,‘s’,‘t’,‘u’,‘v’,‘w’,‘x’,‘y’,‘z’]
from operator import mod
#放射加密
#加密公式:c = E7,21(m)≡7m+21(mod 26)
#定义一个加密函数输入一个字符串对其进行放射加密
def dffinejia(x):
L = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] #把英文字母和十进制数字的对应关系存进一个数组中
#将字符串变成字符数组
s = list(x)
#创建新的数组用来存放加密后的元素
p = []
for k in s:
m = L.index(k) #找到字符在数组L中所对应的位置
c = mod((7*m+21),26) #进行放射加密运算
q = L[c] #得出加密后的字符
p.append(q) #将字符存进新的数组中
str1 ="".join(p) #将数组转化为字符串
print("放射加密后的密码是:",str1)
dffinejia('security')
#============================================================================
#============================================================================
#放射解密
#解密公式:m = D7,21(c)≡7^(-1)(c-21)(mod 26)
#定义一个解密函数输入一个字符串对其进行放射解密
def dffinejie(c):
L = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] #把英文字母和十进制数字的对应关系存进一个数组中
#首先先求出7^(-1)(mod 26)的值
a = 7
T=[]
for x in range(1,100):
for n in range(1,100):
if ((7*x)-(26*n) == 1):
T.append(x)
#T[0]为7^(-1)的值
#将字符串变成字符数组
A = list(c)
#创建新的数组用来存放解密后的元素
Z = []
for j in A:
v = L.index(j) #求出字符在L中的对应位置
M = mod(T[0]*(v-21),26) #进行放射解密运算
e = L[M] #得出解密后的字符
Z.append(e) #将解密后的字符存进新的数组中
str2 = "".join(Z) #最后将字符数组转化为字符串
print("放射解密后的密码是:",str2)
dffinejie("vlxijh")