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的词法分析与语法分析
May 18 Python
Python中的模块和包概念介绍
Apr 13 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
python实现连连看游戏
Feb 14 Python
详解python常用命令行选项与环境变量
Feb 20 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
如何在Python 游戏中模拟引力
Mar 27 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
python基于opencv实现人脸识别
Jan 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
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
js实现微信聊天界面
2020/08/09 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Python中优化NumPy包使用性能的教程
2015/04/23 Python
python binascii 进制转换实例
2019/06/12 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
《我的信念》教学反思
2014/02/15 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
教你如何用cmd快速登录服务器
2022/06/10 Servers