python密码学周期置换密码学习
作者:Jarrycow 发布时间:2021-09-21 16:45:39
标签:python,密码学,周期置换密码
周期置换密码
参考教材:《现代密码学教程》P47 3.1.2
加密解密过程
周期置换密码是将明文p串按固定长度m分组.然后对每组中的子串按1,2…,m的某个置换重新排列位置从而得到密文,其中密钥σ包含分组长度信息。
解密时同样对密文c按长度m分组,并按σ的逆置换σ-1把每组子串重新排列位置从而得到明文p。
以例3.3为例
和上次提及的列置换密码类似
代码
import re
class timeCode:
__key=[] # 密钥
__apaMsg="" # 明文
__secMsg="" #密文
__lenKey=0 #密钥长度 周期值
def getKey(self,s): # 密钥形成函数
Key={}
antiKey={}
s=re.split(r'[()]',s) #以()分界
while '' in s: # 消除''
s.remove('')
temp=[]
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]))
maxtemp=max(temp) #密钥长度
self.__lenKey=maxtemp
lenKey={i+1 for i in range(maxtemp)}
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
Key=self.__key[0]
time=self.__lenKey
p=p.replace(' ','') #去除空格
if len(p)%time != 0:
p+=' '*(time-len(p)%time) #末尾补齐
n=len(p)//time
M=[p[i*time:(i+1)*time] for i in range(n)] #分组生成
M=[M[i][Key[j+1]-1] for i in range(n) for j in range(time)] #矩阵转换
M=''.join(M) #列表转换为字符串
self.__secMsg=M
return M
def deCode(self,q):
self.__apaMsg=p
m=self.__lenKey
n=len(q)//m
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.__key,self.__apaMsg,self.__secMsg,self.__lenKey)
s='(15623)'
p='State Key Laboratory of Networking and Switching'
a=timeCode()
a.getKey(s)
q=a.enCode(p)
a.deCode(q)
a.Print()
来源:https://blog.csdn.net/Jarrycow/article/details/105575517


猜你喜欢
- 1、获取插入数据的主键idimport pymysqldatabase = pymysql.connect( host=&quo
- 下面的查询选择所有 date_col 值在最后 30 天内的记录。 mysql> SELECT something FROM tbl_
- 不想每次都要去查execl,想更方便点,更快一点。通俗点思路:点击exe,Python 自动监控剪贴板的内容,然后正则取出IP,接着根据IP
- 今在服务器上 有mysql 数据库,远程访问,不想公布root账户,所以,创建了demo账户,允许demo账户在任何地方都能访问mysql数
- 首先,需要获取任意知乎的问题,只需要你输入问题的ID,就可以获取相关的页面信息,比如最重要的合计有多少人回答问题。问题ID为如下标红数字编写
- 本文介绍了python中的计时器timeit的使用方法,分享给大家,具体如下:timeit通常在一段程序的前后都用上time.time(),
- 代码如下:<% Randomize Do While Len(pass)<12 
- 有时候我们会需要从网络上爬取一些图片,来满足我们形形色色直至不可描述的需求。一个典型的简单爬虫项目步骤包括两步:获取网页地址和提取保存数据。
- Python读取及保存mat文件在说明python读取mat文件之前需要强调2点:读取的时候需要注意读出来的shape是什么样的,是否符合自
- 一、Python下载安装1、Python官方下载地址:https://www.python.org/downloads官方下载速度太慢,你可
- 单位内部网站第三次修改,即将进入尾声,遇到一个怪现象,就是在自定义标签中,加入链接会被替换掉成这样的格式{$GetInstallDir}ad
- 目的封装轮播图组件,直接使用,具体内容如下大致步骤准备my-carousel组件基础布局,全局注册准备home-banner组件,使用my-
- 本文实例总结了PHP中非常有用却鲜有人知的函数。分享给大家供大家参考,具体如下:PHP里有非常丰富的内置函数,很多我们都用过,但仍有很多的函
- 0 引言年中购物618大狂欢开始了,各大电商又开始了大力度的折扣促销,我们的小胖又给大家谋了一波福利,淘宝APP直接搜索:小胖发福利,每天领
- 分别创建增加、删除、更新的触发器(Trigger)来达到两张表之间数据同步的目的。 1:数据同步增加: 如有两张表——A表和B表,创建触发器
- Python实现文件的全备份和差异备份之前有写利用md5方式来做差异备份,但是这种md5方式来写存在以下问题:md5sum获取有些软连接的M
- 最近在学python的过程中无意间发现一个python库:wxpy,其可以实现让微信自动接收、处理消息并进行回复的一系列功能。感觉挺有意思的
- 自动更新统计信息的基本算法是: · 如果表格是在 tempdb 数据库表的基数是小于 6,自动更新到表的每个六个修改。 · 如果表的基数是大
- 本文实例讲述了MSSql简单查询出数据表中所有重复数据的方法。分享给大家供大家参考,具体如下:这里直接给出下面的例子:SELECT * FR
- 以前学习ASP.NET MVC时,学习与应用,操作过数据显示,添加,编辑,更新和删除等功能。很多方法是相通的,看自己是怎样来进行方便,快捷,