python实现栅栏加解密 支持密钥加密


Posted in Python onMarch 20, 2019

栅栏加解密是对较短字符串的一种处理方式,给定行数Row,根据字符串长度计算出列数Column,构成一个方阵。

加密过程:就是按列依次从上到下对明文进行排列,然后按照密钥对各行进行打乱,最后以行顺序从左至右进行合并形成密文。

解密过程:将上述过程进行逆推,对每一行根据密钥的顺序回复到原始的方阵的顺序,并从密文回复原始的方阵,最后按列的顺序从上到下从左至右解密。

具体实现如下:所有实现封装到一个类RailFence中,初始化时可以指定列数和密钥,默认列数为2,无密钥。初始化函数如下:

def __init__(self, row = 2, mask = None):
  if row < 2:
   raise ValueError(u'Not acceptable row number or mask value')
  self.Row = row
  if mask != None and not isinstance(mask, (types.StringType, types.UnicodeType)):
   raise ValueError(u'Not acceptable mask value')
  self.Mask = mask
  self.Length = 0
  self.Column = 0

加密过程,可以选择是否去除空白字符。首先是类型检查,列数计算等工作,核心是通过计算的参数得到gird这个二维列表表示的方阵,也是栅栏加密的核心。具体实现如下:

def encrypt(self, src, nowhitespace = False):
  if not isinstance(src, (types.StringType, types.UnicodeType)):
   raise TypeError(u'Encryption src text is not string')
  if nowhitespace:
   self.NoWhiteSpace = ''
   for i in src:
    if i in string.whitespace: continue
    self.NoWhiteSpace += i
  else:
   self.NoWhiteSpace = src
  
  self.Length = len(self.NoWhiteSpace)
  self.Column = int(math.ceil(self.Length / self.Row))
  try:
   self.__check()
  except Exception, msg:
   print msg
  #get mask order
  self.__getOrder()
  
  grid = [[] for i in range(self.Row)]
  for c in range(self.Column):
   endIndex = (c + 1) * self.Row
   if endIndex > self.Length:
    endIndex = self.Length
   r = self.NoWhiteSpace[c * self.Row : endIndex]
   for i,j in enumerate(r):
    if self.Mask != None and len(self.Order) > 0:
     grid[self.Order[i]].append(j)
    else:
     grid[i].append(j)
  return ''.join([''.join(l) for l in grid])

其中主要的方法是按照列数遍历,每次从明文中取列数个数的字符串保存在遍历 r 中,其中需要处理最后一列的结束下标是否超过字符串长度。然后将这一列字符串依次按照顺序加入到方阵grid的各列对应位置。

解密过程复杂一些,因为有密钥对顺序的打乱,需要先恢复打乱的各行的顺序,得到之前的方阵之后,再按照列的顺序依次连接字符串得到解密后的字符串。具体实现如下:

def decrypt(self, dst):
  if not isinstance(dst, (types.StringType, types.UnicodeType)):
   raise TypeError(u'Decryption dst text is not string')
  self.Length = len(dst)
  self.Column = int(math.ceil(self.Length / self.Row))
  try:
   self.__check()
  except Exception, msg:
   print msg
  #get mask order
  self.__getOrder()
  
  grid = [[] for i in range(self.Row)]
  space = self.Row * self.Column - self.Length
  ns = self.Row - space
  prevE = 0
  for i in range(self.Row):
   if self.Mask != None:
    s = prevE
    O = 0
    for x,y in enumerate(self.Order):
     if i == y:
      O = x
      break
    if O < ns: e = s + self.Column
    else: e = s + (self.Column - 1)
    r = dst[s : e]
    prevE = e
    grid[O] = list(r)
   else:
    startIndex = 0
    endIndex = 0
    if i < self.Row - space:
     startIndex = i * self.Column
     endIndex = startIndex + self.Column
    else:    
     startIndex = ns * self.Column + (i - ns) * (self.Column - 1)
     endIndex = startIndex + (self.Column - 1)
    r = dst[startIndex:endIndex]
    grid[i] = list(r)
  res = ''
  for c in range(self.Column):
   for i in range(self.Row):
    line = grid[i]
    if len(line) == c:
     res += ' '
    else:
     res += line[c]
  return res

实际运行

测试代码如下,以4行加密,密钥为bcaf:

rf = RailFence(4, 'bcaf')
e = rf.encrypt('the anwser is wctf{C01umnar},if u is a big new,u can help us think more question,tks.')
print "Encrypt: ",e
print "Decrypt: ", rf.decrypt(e)

结果如下图:

python实现栅栏加解密 支持密钥加密

说明:这里给出的解密过程是已知加密的列数,如果未知,只需要遍历列数,重复调用解密函数即可。

完整代码详见这里

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用scrapy解析js示例
Jan 23 Python
Python logging模块学习笔记
May 24 Python
python在linux中输出带颜色的文字的方法
Jun 19 Python
Python生成随机密码
Mar 10 Python
python如何压缩新文件到已有ZIP文件
Mar 14 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
Django Path转换器自定义及正则代码实例
May 29 Python
pandas DataFrame运算的实现
Jun 14 Python
python实现Virginia无密钥解密
Mar 20 #Python
python实现维吉尼亚加密法
Mar 20 #Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 #Python
python实现对输入的密文加密
Mar 20 #Python
python实现字符串加密成纯数字
Mar 19 #Python
python实现简单加密解密机制
Mar 19 #Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 #Python
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
提取HTML标签
2006/10/09 PHP
PHP实现的json类实例
2015/07/28 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
php中错误处理操作实例分析
2019/08/23 PHP
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
python实现文本界面网络聊天室
2018/12/12 Python
wxPython实现列表增删改查功能
2019/11/19 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Keras 使用 Lambda层详解
2020/06/10 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
在校生党员自我评价
2013/09/25 职场文书
公司离职证明范本
2014/01/13 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
新年晚会主持词
2014/03/24 职场文书
网络信息安全承诺书
2014/03/26 职场文书
志愿者宣传口号
2014/06/17 职场文书
2014年商场工作总结
2014/11/22 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书