任意栏数的栅栏加密解密脚本算法分析
Posted erfze
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任意栏数的栅栏加密解密脚本算法分析相关的知识,希望对你有一定的参考价值。
脚本参考:https://github.com/erfze/CTF_tools/tree/master/Rail_Fence_encipherment
1.字符串等长分割
def cut_string(string,length): textArr=re.findall(‘.{‘+str(length)+‘}‘,string) textArr.append(string[len(textArr)*length:]) return textArr
用re模块中的findall进行字符串按指定长度分割,可以参考伯乐在线上这篇介绍re模块的文章(http://python.jobbole.com/88729/),我觉得讲得很详细,条理很清晰。
findall的第一个参数是pattern(模式匹配对象),下面这个参数代表了以指定的分割长度构造的正则表达式。
‘.{‘+str(length)+‘}‘
2.加密
def rail_fence_encryption(group_char_number,string): str_len=len(string) TS_list=cut_string(string,group_char_number)#temporary storage result_str=‘‘ for i in range(group_char_number): for j in range(len(TS_list)): try: result_str=result_str+TS_list[j][i] except: pass return ‘Encryption result:‘+result_str
group_char_number代表了每栏的字符数,用cut_string函数分割字符串,即使最后一栏的字符数达不到group_char_number也会作为一栏。
比如:
rail_fence_encryption(3,‘1234567890‘)
结果是:
[‘123‘,‘456‘,‘789‘,‘0‘]
而try-except就是防止索引值超过最后一栏的长度。
3.解密
def rail_fence_decryption(group_number,string): group_char_number=int(math.floor(len(string)/group_number)) add_char_number=len(string)%group_number TS_list1=cut_string(string[:((group_char_number+1)*add_char_number)],group_char_number+1) TS_list2=cut_string(string[((group_char_number+1)*add_char_number):],group_char_number) TS_list=TS_list1+TS_list2 result_str=‘‘ for i in range(group_char_number+1): for j in range(len(TS_list)): try: result_str=result_str+TS_list[j][i] except: pass return ‘Decryption result:‘+result_str
解密有点复杂,首先是group_number代表栏数,而group_char_number代表每栏“正常”(稍后我会说到“不正常”的情况)应该拥有的每栏字符数。
add_char_number代表最后分栏中前几栏应该每栏字符数+1,下面举个栗子就一目了然了。
rail_fence_decryption(4,‘1234567890‘)
字符串长度是10,而栏数为4,不能正好分割字符串,那么“正常”的每栏字符数应该是int(10/4),但是还余下10%4=2个字符,这两个字符就是要前两栏每栏字符数长度+1.
结果如下:
[‘123‘,‘456‘,‘78‘,‘90‘]
如果觉得有点难理解的话,自己举几个栗子代入函数中模拟运行一下就会理解了。
以上是关于任意栏数的栅栏加密解密脚本算法分析的主要内容,如果未能解决你的问题,请参考以下文章
C++代码 递归算法 n个数的全排列 (是任意的,可不连续) 要求: 提示输入数的个数n 然后提示输入这n个