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通过future处理并发问题
Oct 17 Python
Python实现一个简单的验证码程序
Nov 03 Python
Python 实现异步调用函数的示例讲解
Oct 14 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
Python中list的交、并、差集获取方法示例
Aug 01 Python
pytorch 共享参数的示例
Aug 17 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
分布式全文检索引擎ElasticSearch原理及使用实例
Nov 14 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
php中__toString()方法用法示例
2016/12/07 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript 中__proto__和prototype详解
2014/11/25 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
JavaScript类的写法
2016/09/17 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
js倒计时显示实例
2016/12/11 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
2017/06/12 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
Python3基础之基本数据类型概述
2014/08/13 Python
使用python实现rsa算法代码
2016/02/17 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python 专题四 文件基础知识
2017/03/20 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
python 实现简易的记事本
2020/11/30 Python
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
师德演讲稿范文
2014/05/06 职场文书
社保转移委托书范本
2014/10/08 职场文书
教师学期末个人总结
2015/02/13 职场文书
nginx lua 操作 mysql
2022/05/15 Servers