python 编程练习——一种密码方法:逆矩阵的应用

Python YX ⋅ 于 2020-05-20 13:42:58 ⋅ 最后回复由 热心市民小杨 2020-05-23 20:19:14 ⋅ 260 阅读
一种密码方法——逆矩阵的应用

根据如下图片讲述的算法,实现一种加密解密算法,可输入明文,获得“密码”,亦可“解密”

file

file

参考文献

数学建模入门--125个有趣的经济管理问题

file

成为第一个点赞的人吧 :bowtie:
回复数量: 4
  • JanetZ
    2020-05-21 11:43:01
    import numpy as np
    letters = [' ','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']
    word_standard = []
    save_numbers=[]
    read_number=[]
    return_word=[]
    decode=''
    codes=''
    word=input("请输入想要加密的明文:")
    word_standard.append(word.upper())
    for i in (','.join(word_standard)):
        for j in range(len(letters)):
            if i == letters[j] :
                save_numbers.append(j)
    row = len(save_numbers) / 3
    M = np.mat(np.array(save_numbers).reshape(int(row),3))
    A=np.mat([[-1,0,1],
             [1,-1,1],
             [1,1,0]])
    MA = M*A
    return_number=MA.tolist()
    for m in return_number:
        for n in range(len(m)):
            read_number.append(m[n])
    for i in read_number:
        codes += letters[i]
    print("密文为:" + codes.lower())
    print("是否需要解密?(Y/N)")
    judge = input()
    if judge == 'N':
        exit()
    else:
        m = (MA*A.I).tolist()
        for a in m:
            for b in range(len(a)):
                return_word.append(round(a[b]))
    for a in return_word:
        decode += letters[a]
    print("解密结果为:" + decode.title())
  • JanetZ
    2020-05-21 11:45:17
    请输入想要加密的明文:Hill on Tuesday
    密文为:mcqcolftncnzvxe
    是否需要解密?(Y/N)
    Y
    解密结果为:Hill On Tuesday
  • 热心市民小杨
    2020-05-23 20:18:57
    import numpy as np
    
    def generate_plaintext():
        '''
        生成明文
        :return: 返回的是明文对应的数字
        '''
        num = []  # 存储明文对应的数字
        while True:
            info = input('请输入你要传递的明文:')
            if len(info) % 3 == 0:
                info = info.upper()
                for alpha in info:
                    for key, values in dict_.items():
                        if alpha == values:
                            num.append(key)
                break
            else:
                print('输入的明文长度要为3的整数倍!请重新输入!')
        return num
    
    def encryption(num, encr_matrix):
        '''
        加密
        :param num:明文對應的數字
        :param encr_matrix:加密矩陣
        :return:返回加密后信息和矩陣
        '''
        encry_mess = ''  # 存储加密信息
        row = int(len(num) / 3)
        col = 3
        num_arr = np.array(num).reshape(row, col)
        encr_info = np.matmul(num_arr, encr_matrix)
        encr_info_ = encr_info.flatten()
        for i in list(encr_info_):
            encry_mess += dict_[i]
        return encry_mess, encr_info
    
    def deciphering(encr_info, encr_matrix):
        '''
        解密
        :param encr_info:加密後的矩陣
        :param encr_matrix:加密矩陣
        :return:
        '''
        deci_info = ''  # 存储解密后的信息
        deci_matrix = np.linalg.inv(encr_matrix)  # 產生解密矩陣
        deci_arr = np.matmul(encr_info, deci_matrix)
        deci_arr = np.around(deci_arr)
        # deci_list = deci_arr.tolist()
        deci_list = list(deci_arr.flatten())
        # print(deci_list)
        for i in deci_list:
            deci_info += dict_[i]
        return deci_info
    
    if __name__ == '__main__':
        dict_ = {0: ' ', 1: "A", 2: 'B', 3: "C", 4: 'D', 5: 'E', 6: "F", 7: 'G', 8: 'H',
                 9: "I", 10: 'J', 11: 'K', 12: "L", 13: 'M', 14: 'N', 15: "O", 16: 'P', 17: 'Q', 18: "R", 19: 'S',
                 20: 'T', 21: "U", 22: 'V', 23: 'W', 24: "X", 25: 'Y', 26: 'Z'}
        num = generate_plaintext()
        encr_matrix = np.array([[-1, 0, 1], [1, -1, 1], [1, 1, 0]])
        # print(num)
        encr_mess, encr_info = encryption(num, encr_matrix)
        print('加密后的信息为:{}'.format(encr_mess))
        info = input('请选择是否要进行解密:(y/n)')
        if info == 'y':
            deci_info = deciphering(encr_info, encr_matrix)
            print('解密后的信息为:{}'.format(deci_info.lower()))
  • 热心市民小杨
    2020-05-23 20:19:14

    请输入你要传递的明文:hill on tuesday
    加密后的信息为:MCQCOLFTNCNZVXE
    请选择是否要进行解密:(y/n)y
    解密后的信息为:hill on tuesday

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter