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登录Gmail并发送Gmail邮件的教程
Apr 17 Python
python Pygame的具体使用讲解
Nov 03 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
python print 按逗号或空格分隔的方法
May 02 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
对Python 数组的切片操作详解
Jul 02 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
Django 静态文件配置过程详解
Jul 23 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
30秒学会30个超实用Python代码片段【收藏版】
Oct 15 Python
python 将Excel转Word的示例
Mar 02 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
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
JS远程获取网页源代码实例
2013/09/05 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
Python性能提升之延迟初始化
2016/12/04 Python
Python 多线程实例详解
2017/03/25 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
python获取整个网页源码的方法
2020/08/03 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
拉丁舞学习者的自我评价
2013/10/27 职场文书
小学教师师德反思
2014/02/03 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
作风建设剖析材料
2014/10/06 职场文书
投标邀请书范本
2015/02/02 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
毕业证明模板
2015/06/19 职场文书
聘任书格式及范文
2015/09/21 职场文书
《观察物体》教学反思
2016/02/17 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫