python使用门算法加密文件(python实现栅栏加解密 支持密钥加密)
类别:脚本大全 浏览量:1652
时间:2021-11-01 10:42:55 python使用门算法加密文件
python实现栅栏加解密 支持密钥加密栅栏加解密是对较短字符串的一种处理方式,给定行数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) |
结果如下图:
说明:这里给出的解密过程是已知加密的列数,如果未知,只需要遍历列数,重复调用解密函数即可。
完整代码详见这里
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/u010487568/article/details/46642955
您可能感兴趣
- python列表切片和分片(Python列表切片操作实例总结)
- python3.7不兼容pywinauto(浅谈python编译pyc工程--导包问题解决)
- docker python如何运行(Docker容器化部署Python应用过程解析)
- python发送钉钉消息(钉钉群自定义机器人消息Python封装的实例)
- python发送微信消息脚本(python实现给微信指定好友定时发送消息)
- python 简单算法(python实现爬山算法的思路详解)
- python3第三方库手册(使用python3构建文件传输的方法)
- python全局变量设置(Python3.5局部变量与全局变量作用域实例分析)
- python可以编写数据加密解密吗(python简单实现AES加密和解密)
- python的多线程比多进程效率高(Python中单线程、多线程和多进程的效率对比实验实例)
- python爬虫书籍经典(Python利用lxml模块爬取豆瓣读书排行榜的方法与分析)
- python里面的time如何用(详解python:time模块用法)
- python模块学习之random模块(详解Python基础random模块随机数的生成)
- python2.7中logging的使用方式(Python中使用logging和traceback模块记录日志和跟踪异常)
- python中导入模块的命令(Python3 导入上级目录中的模块实例)
- 12步轻松搞定python装饰器(Python3.5装饰器典型案例分析)
- 鲢鳙钓底还是钓浮 流水的水域应怎样做钓(鲢鳙钓底还是钓浮)
- 入秋后的第二场苹果发布会来了 全新M1系列芯片登场(入秋后的第二场苹果发布会来了)
- 苹果正式发布自研芯片M1 5nm 32核心 彻底放弃Intel(苹果正式发布自研芯片M1)
- 苹果自研芯片跑分对比 A16芯片排名靠后,M1系列霸榜(苹果自研芯片跑分对比)
- X86处理器的梦魇 苹果M1自研芯片到底有多强(苹果M1自研芯片到底有多强)
- 泰剧《爱欲之神》Boom kitkong和Great合体杂志(泰剧爱欲之神Boomkitkong和Great合体杂志)
热门推荐
- django settings配置(Django重置migrations文件的方法步骤)
- dede执行查询语句(dede搜索关键字/tag标签不能区分大写字母的临时解决方法)
- linux如何查看apache日志(限制 Apache日志文件大小的方法)
- 以双斜杠//开头的URL的含义
- 使用Visual Studio对项目进行远程调试
- html代码简单特效(HTML实现代码雨源码及效果示例)
- python计算1到10的阶乘的和(python计算阶乘和的方法1!+2!+3!+...+n!)
- python多进程与多线程详解(Python线程之定位与销毁的实现)
- python画图教程(详解用Python练习画个美队盾牌)
- canvas俄罗斯方块(JavaScript canvas实现俄罗斯方块游戏)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9