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的架构
Aug 12 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
微信跳一跳python代码实现
Jan 05 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
python匿名函数的使用方法解析
Oct 10 Python
Python容器类型公共方法总结
Aug 19 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
python实现ROA算子边缘检测算法
Apr 05 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
CakePHP框架Session设置方法分析
2017/02/23 PHP
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
js设置默认时间跨度过程详解
2019/07/17 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
Python定时执行之Timer用法示例
2015/05/27 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
python感知机实现代码
2019/01/18 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
python判断链表是否有环的实例代码
2020/01/31 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
标记环介质访问控制协议
2016/03/27 面试题
优秀生推荐信范文
2013/11/28 职场文书
小学生成长感言
2014/01/30 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
领导干部作风建设总结
2014/10/23 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
2014年保育员工作总结
2014/12/02 职场文书
使用python求解迷宫问题的三种实现方法
2022/03/17 Python