栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python实现易位密码法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python实现易位密码法

def Generate_2D_array():
    '''
    生成二维数组
    :return:
    '''
    array = []     #二维数组
    line = []
    for m in range(len(mw)):
        line.append(mw[m])
        if (m+1)%len(key)==0:
            array.append(line)
            line = []
    if line!=[]:
        array.append(line)
    for e in array:
        print(e)
    return array

def Mapping_relation_table():
    '''
    根据密钥对应字母表的列序号
    :return: 列序号
    '''
    sequence = []
    num = 1
    for p in key:
        sequence.append(0)   #创建一个全为0的数组,长度与密钥一致
    zmb = ['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']
    for z in range(len(zmb)):      #建立密钥与字母表的映射关系
        for p in range(len(key)):
            if key[p] == zmb[z]:
                sequence[p] = num
                num+=1
    print(sequence)
    return sequence

def encryption(array):
    '''
    加密算法
    :param array:
    :return: 密文
    '''
    sequence = Mapping_relation_table()
    ciphertext = ''
    ciphertext_map = {}
    for s in range(len(sequence)):      #根据列序号匹配二维数组的信息得到密文
        text = ''
        for i in array:
            try:
                text+=i[s]
            except IndexError:
                pass
        ciphertext_map[sequence[s]] = text
    ciphertext_map = sorted(ciphertext_map.items(),key=lambda kv:kv[0])

    for c in ciphertext_map:
        ciphertext+=c[1]
    return ciphertext

def Decryption(ciphertext,sequence):
    '''
    解密算法 根据位置偏移解密 根据序列号乘以密钥长度,然后得到明文的位置,然后返回结果输出明文
    :param ciphertext:
    :param sequence:
    :return: 明文
    '''
    c_length = len(ciphertext)
    mtext = []
    for i in range(c_length):
        mtext.append(0)
    count = 0
    for m in range(len(mtext)):
        n = m*len(sequence)
        for s in sequence:
            if n >= len(mw):
                break
            n_place = 0
            for i in range(1,s):
                n_place+=length_map[i]
            mtext[n] = ciphertext[n_place+count]
            n += 1
        count+=1
    Plaintext = ''.join(mtext)
    return Plaintext

def len_dict(array):
    '''
    算二维数组行列长度
    :param array:
    :return: length_map
    '''
    length_map_ = {}
    length_map = {}
    cnt = 1
    for e in range(len(array[0])):
        for i in range(len(array)):
            try:
                if array[i][e]:
                    length_map_[e] = cnt
                    cnt += 1
            except:
                pass
    l_map = length_map_.copy()
    for l in length_map_.keys():
        if l == 0:
            pass
        else:
            length_map_[l] = length_map_[l] - l_map[l - 1]
    for s, j in zip(sequence, list(length_map_.values())):
        length_map[s] = j
    return length_map

if __name__ == '__main__':
    while True:
        print('======易位加密解密系统=========')
        print('========输入1加密============')
        print('========输入2解密============')
        print('=======输入其他退出程序========')
        choice = input('')
        if choice == '1':
            key = input('输入一段密钥')
            mw = input('请输入一段明文')
            mw = mw.strip().replace(' ', '')
            array = Generate_2D_array()
            ciphertext = encryption(array)
            print('加密后的内容是:', ciphertext)
        elif choice == '2':
            ciphertext = input('输入一段密文')
            key = input('输入一段密钥')
            sequence = Mapping_relation_table()
            array = Generate_2D_array()
            e_length = len(array)
            length_map = len_dict(array)
            Plaintext = Decryption(ciphertext, sequence)
            print('解密后的明文为:', Plaintext)
        else:
            print('退出程序')
            quit()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980570.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号