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实现无证书加密解密实例
Oct 27 Python
python使用PyGame模块播放声音的方法
May 20 Python
详解Python中的静态方法与类成员方法
Feb 28 Python
Python标准库inspect的具体使用方法
Dec 06 Python
pandas 读取各种格式文件的方法
Jun 22 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
Python如何在循环内使用list.remove()
Jun 01 Python
python datetime时间格式的相互转换问题
Jun 11 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
python实现双链表
May 25 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
追求程序速度,而不是编程的速度
2008/04/23 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
python实现银行账户系统
2021/02/22 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
致全体运动员广播稿
2014/02/01 职场文书
保安岗位职责
2014/02/21 职场文书
考核工作实施方案
2014/03/30 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
设备技术员岗位职责
2015/04/11 职场文书
实习证明模板
2015/06/16 职场文书
父亲去世追悼词
2015/06/23 职场文书