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下线程之间的共享和释放示例
May 04 Python
Flask框架的学习指南之制作简单blog系统
Nov 20 Python
python中requests小技巧
May 10 Python
Python用for循环实现九九乘法表
May 31 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
Python3实现腾讯云OCR识别
Nov 27 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
Python FFT合成波形的实例
Dec 04 Python
pytorch标签转onehot形式实例
Jan 02 Python
Python vtk读取并显示dicom文件示例
Jan 13 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
如何基于windows实现python定时爬虫
May 01 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
在php中取得image按钮传递的name值
2006/10/09 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
javascript学习网址备忘
2007/05/29 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
2015/03/31 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
目前最全的python的就业方向
2018/06/05 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
EJB的基本架构
2016/09/22 面试题
旅游文化节策划方案
2014/06/06 职场文书
体育节口号
2014/06/19 职场文书
电子专业求职信
2014/06/19 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
采购部年度工作总结
2015/08/13 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
MySQL去除密码登录告警的方法
2022/04/20 MySQL