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解释器理解Python中的字节码
Apr 01 Python
Python中有趣在__call__函数
Jun 21 Python
python数据结构之链表详解
Sep 12 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
python 图像平移和旋转的实例
Jan 10 Python
python多线程下信号处理程序示例
May 31 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 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之PHP语法学习笔记1
2006/12/17 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
如何使用angularJs
2017/05/08 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
vuex入门最详细整理
2020/03/04 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
python简单贪吃蛇开发
2019/01/28 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
Python如何输出整数
2020/06/07 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
客户答谢会活动方案
2014/08/31 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
生日祝酒词大全
2015/08/10 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python