单表代换密码之仿射密码的代码实现

仿射变换的加解密分别是:

加密公式: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")

实验结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wzl_fd/article/details/82798040