仿射加解密程序——python

假设X,Y,a,b是Z52整数环中的元素,a和b为密钥,X是原文,Y是密文
加密函数:Y=(aX+b)%52

获取乘法逆元

  通过扩展的欧几里得算法求a的乘法逆元

加密过程

  加密函数:Y=(aX+b)%52

解密过程

  解密函数:X=(a的逆元)*(Y-B)%52

Z52整数环是一个从a,b,c……Z,A,B……Z,总共52个字母的字符串,可以用python中的string.ascii_letters模块得到。

import string

# 加密
def encrypt(k1, k2, message):
    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
# 获取a的逆元
def get_inverse(a):
    for i in range(1, 52):
        if a*i % 52 == 1:
            return i
# 解密
def decrypt(k1, k2, message):
    a_inv = get_inverse(k1)
    str_list = string.ascii_letters
    t = ""
    for i in message:
        if i.isalpha():
            i = (str_list.index(i) - k2)*a_inv % 52
            t += str_list[i]
        else:
            t += i
    return t

def main():
    mode = int(input())
    message = input()
    key1 = int(input())
    key2 = int(input())
    if mode == 1:
        translated = encrypt(key1, key2, message)
    else:
        translated = decrypt(key1, key2, message)
    print(translated)

if __name__ == '__main__':
    main()

 

posted @ 2022-07-26 14:20  扶光Chor  阅读(244)  评论(0)    收藏  举报