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中的CURL PycURL使用例子
Jun 01 Python
python3实现ftp服务功能(客户端)
Mar 24 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
python语言中with as的用法使用详解
Feb 23 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
Python实现的文轩网爬虫完整示例
May 16 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
python -v 报错问题的解决方法
Sep 15 Python
基于python实现坦克大战游戏
Oct 27 Python
Python爬虫中Selenium实现文件上传
Dec 04 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
xml+php动态载入与分页
2006/10/09 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
Laravel框架FormRequest中重写错误处理的方法
2019/02/18 PHP
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
python3使用urllib模块制作网络爬虫
2016/04/08 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
python super的使用方法及实例详解
2019/09/25 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
学习python需要有编程基础吗
2020/06/02 Python
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
单位工程竣工验收方案
2014/03/16 职场文书
2014年优秀党员材料
2014/12/18 职场文书
春季运动会开幕词
2015/01/28 职场文书
2015年加油站工作总结
2015/05/13 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
导游词之昭君岛
2020/01/17 职场文书
新手必备Python开发环境搭建教程
2021/05/28 Python
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Hive导入csv文件示例
2022/06/25 数据库