仿射密码__Z52整数环
仿射密码说明
仿射密码是一种替换密码。它是一个字母对一个字母的。它的加密函数是,其中a和m互质,m是字母的数目。
解码函数是,其中
是a在
群的乘法逆元。
乘法逆元
基于扩展欧几里得除法。
我们知道,对于自然界的正整数...a,b...一定满足ax+by==gcd(a,b); (解一定存在,根据数论中的相关定理)
下面我们来证明ta:
(1)...ax+by==gcd(a,b);
(2)...bx1+a%by1==gcd(b,a%b); (运用欧几里算法)
(3)...gcd(a,b)==gcd(b,a%b); (欧几里得算法)
(4)...ax+by==bx1+a%b*y1; (在计算机里a%b==(a-a/b*b))
(5)...ax+by==bx1+ay1-a/b*by1;
(6)...ax+by==ay1+b(x1-a/b)y1; (合并同类项)
(7)...x==y1,y==x1-a/b*y1; (结论)
所以我们知道x,y和方程的下一个状态量(x1,y1)有关,而方程最后一个状态(即gcd(a,b)终点,b==0; 还记得吗?)此时:
ax+0==a; (gcd(a,b)的最终返回值为a) 可以得到一组解{x==1; y==0},根据此解层层回溯即可得到最开始的x,y.
# 计算ei # 请在此处添加代码 # # *************begin************# if m == 0: return 1, 0 else: x, y = Get_ei(m, a % m) x, y = y, (x - (a // m) * y) return x,y
Z52整数环
利用python中的string模块里的string.ascii_letters生成一个Z52整数环
加密、解密
加密
def encrypt(k1,k2,message): # *************begin************# str_list = [] str_list = string.ascii_letters t = "" for i in message: if i.isalpha(): i = (str_list.index(i)*k1+k2)%52 t+=str_list[i] else: t+=i return(t)
解密
(注意:如果当逆元为负数时,需要再加一轮M,即再多模一次M)
t = "" str_list = [] str_list = string.ascii_letters x = Get_ei(k1,26) k3 = x[0] if k3<0: k3 = k3+26 for i in message: if i.isalpha(): i = ((str_list.index(i)-k2)*k3)%52 t+=str_list[i] else: t+=i return(t)