仿射密码__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)

参考:https://blog.csdn.net/AAMahone/article/details/79320635

posted @ 2020-06-07 22:17  xixi78  阅读(206)  评论(0)    收藏  举报