我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python密码学列置换密码学习

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python密码学列置换密码学习

列置换密码

参考教材:《现代密码学教程》P46 3.1.1

过程

加密过程

  • 将明文p以设定的固定分组宽度m按行写出,即每行有m个字符;若明文长度不是m的整数倍,则不足部分用双方约定的方式填充,如双方约定用空格代替空缺处字符,不妨设最后得字符矩阵[Mp]n×m
  • 按1,2…,m的某一置换σ交换列的位置次序得字符矩阵[Mp]n×m
  • 把矩阵按[Mp]n×m列的顺序依次读出得密文序列c。

解密过程

  • 将密文c以分组宽度n按列写出得到字符矩阵[Mp]n×m
  • 按加密过程用的置换σ的逆置换σ-1交换列的位置次序得字符矩阵[Mp]n×m
  • 把矩阵[Mp]n×m按1,2…,n行的顺序依次读出得明文p

说明

以例3.2为例

σ=(143)(56)即每个括号里部分轮着相对应

1→4→3→1

5→6→5

这里我是用字典表示

        for i in range(len(s)): 
            for j in range(len(s[i])-1):
                Key[int(s[i][j])]=int(s[i][j+1]) #密钥字典
                antiKey[int(s[i][j+1])]=int(s[i][j]) #反密钥字典
            Key[int(s[i][-1])]=int(s[i][0]) #解决最后一个的问题
            antiKey[int(s[i][0])]=int(s[i][-1])
            temp.append(int(s[i][-1]))

当然,这儿σ=(143)(56)中没有2,因为2对应他自己即

2→2

所以要再单独表示

sameKey=lenKey-set(temp) #找到没有变化的密钥
    for i in sameKey:
        Key[i]=i
        antiKey[i]=i

而加密的时候,便是把明文先变为矩阵,载根据密钥进行转换

比如本题便将矩阵第一列转换为第四列,第四列转换为第三列,第三列转换为第一列,以此类推

这里可以用生成式完成

M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)] #矩阵转换

完整代码

'''列置换密码
Auher:Jarrycow
time:2020-04-17
'''
import re
class colCode:
    __m=0
    __n=0
    __key=[] # 密钥
    __apaMsg="" # 明文
    __secMsg="" #密文
    def __init__(self,m): # 初始化,定义矩阵宽
        self.__m=m
        __n=0
        __key=[] 
        __apaMsg="" 
        __secMsg="" 
    def getKey(self,s): # 密钥形成函数
        m=self.__m
        Key={}
        antiKey={}
        s=re.split(r'[()]',s) #以()分界
        while '' in s: # 消除''
            s.remove('')
        temp=[]
        lenKey={i+1 for i in range(m)} #密钥长度
        for i in range(len(s)): 
            for j in range(len(s[i])-1):
                Key[int(s[i][j])]=int(s[i][j+1]) #密钥字典
                antiKey[int(s[i][j+1])]=int(s[i][j]) #反密钥字典
                temp.append(int(s[i][j])) #钥匙收录
            Key[int(s[i][-1])]=int(s[i][0]) #解决最后一个的问题
            antiKey[int(s[i][0])]=int(s[i][-1])
            temp.append(int(s[i][-1]))
        sameKey=lenKey-set(temp) #找到没有变化的密钥
        for i in sameKey:
            Key[i]=i
            antiKey[i]=i
        self.__key.append(Key)
        self.__key.append(antiKey)
    def enCode(self,p): #加密函数
        self.__apaMsg=p
        m=self.__m
        n=self.__n
        Key=self.__key[0]
        p=p.replace(' ','') #去除空格
        p+=' '*(m-len(p)%m) #末尾补齐
        n=len(p)//m #矩阵列数
        self.__n=n
        M=[p[i*m:(i+1)*m] for i in range(n)] #矩阵生成
        M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)] #矩阵转换
        M=''.join(M) #列表转换为字符串
        self.__secMsg=M
        return M
    def deCode(self,q):
        self.__apaMsg=p
        m=self.__m
        n=self.__n
        Key=self.__key[1]
        M=[q[i*m:(i+1)*m] for i in range(n)]
        M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)]
        M=''.join(M)
        self.__secMsg=M
        return M
    def Print(self):
        print(self.__m,self.__n,self.__key,self.__apaMsg,self.__secMsg)
if __name__=='__main__':
    m=6
    p="Beijing 2008 Olympic Games"
    s='(143)(56)'
    a=colCode(m)
    a.getKey(s)
    q=a.enCode(p)
    e=a.deCode(q)
    a.Print()
def main():
    pass

以上就是python密码学列置换密码学习的详细内容,更多关于python密码学列置换密码的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python密码学列置换密码学习

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python密码学Vignere密码怎么使用

这篇“python密码学Vignere密码怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python密码学Vigne
2023-06-30

python如何实现列置换密码

这篇文章主要介绍了python如何实现列置换密码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python如何实现列置换密码文章都会有所收获,下面我们一起来看看吧。过程加密过程将明文p以设定的固定分组宽度m按行
2023-06-30

python--学习--用户名和密码验证

#!/usr/bin/python3user='whoooo'password="1234567"name=input("请输入用户名:")namepasswd=input("请输入密码:")count1=1count2=1while na
2023-01-31

密码学3

1.Vigenere加密法①自动秘钥加密法的一个简化形式②基于关键词的加密系统,关键词写在明文上面不断书写例:关键词为“hold”,明文为“this is the plaintext”秘钥   h o  l  d  h  o  l  d  
2023-01-31

python机器学习密码之初来乍到

机器学习近来火得可谓人尽皆知。其实楼主现在的研究方向是椭圆曲线密码的硬件实现。so,我一直以为这跟Python,神经网络啥的确是八竿子打不着,然而,这个世界上就是不缺那种能开先河能摆证据撂服众生的大神。举个栗子这篇文章learing the
2023-01-31

密码危机:深度学习正在加速密码破解!

信息安全专家们一直在探索“生成式对抗网络”(GAN)如何提高我们的在线安全性,并取得了令人鼓舞的结果。近日,新泽西州史蒂文斯理工学院和纽约理工学院的研究人员开发了使用GAN猜测密码的方法。该小组开发了一个实验,通过其被称为“PassGan”
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录