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转换doc到pdf(利用python将图片版PDF转文字版PDF)
- python简单代码画图(python+pyqt5实现图片批量缩放工具)
- python自动计算机器人(python实现nao机器人手臂动作控制)
- python字典键对应的值(Python 互换字典的键值对实例)
- 如何去阿里云解析域名(利用Python+阿里云实现DDNS动态域名解析的方法)
- python 元组基本操作(Python元组知识点总结)
- python列表精讲33节(Python列表知识应知应会)
- python如何读取文件(Python从文件中读取数据的方法讲解)
- python编写计算机病毒教程(Python告诉你木马程序的键盘记录原理)
- python简易翻译器的运行(Python3.6实现带有简单界面的有道翻译小程序)
- python中输入背景颜色的代码(Python 给屏幕打印信息加上颜色的实现方法)
- python成绩判断系统(Python根据成绩分析系统浅析)
- python 简单算法(python实现爬山算法的思路详解)
- python怎么操作mysql(详解Python的数据库操作pymysql)
- python开启多线程(python 多线程重启方法)
- python最简单实例(Python文件打开方式实例详解a、a+、r+、w+区别)
- 800壮士拼死拖住30万日军 八佰 的真实历史,誓与阵地共存亡(800壮士拼死拖住30万日军)
- 演员陈创,火于 哮天犬 ,颠峰于 福贵 ,现状却令人唏嘘(演员陈创火于哮天犬)
- 幼小衔接-20以内看图读数 写数 数的组成练习题(幼小衔接-20以内看图读数)
- 你只要花上20天记单词,英语成绩就能从57提到100(你只要花上20天记单词)
- 夕云天际飞,亢龙化太极(夕云天际飞亢龙化太极)
- 爱情可以当饭吃吗(怎么回复)
热门推荐
- sql解析器配置(sql字段解析器的实现示例)
- django查找路径(Django Sitemap 站点地图的实现方法)
- mvc JavaScriptResult的用法
- 自建docker镜像仓库(使用docker制作分布式lnmp 镜像)
- docker镜像保存教程(docker镜像导入导出备份迁移的操作)
- python常用的字符串操作方法(Python字符串的常见操作实例小结)
- python在mysql创建数据库(python3对接mysql数据库实例详解)
- linux本地文件夹双向同步(linux两台服务器实现自动同步文件)
- 云主机功能描述(云主机有哪些使用优势?)
- response的contentType的类型值
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9