标签:指定 cipher bsp list 正则 storage ret app 分析
脚本参考: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‘]
如果觉得有点难理解的话,自己举几个栗子代入函数中模拟运行一下就会理解了。
标签:指定 cipher bsp list 正则 storage ret app 分析
原文地址:https://www.cnblogs.com/erfze/p/9409545.html