码迷,mamicode.com
首页 > 编程语言 > 详细

任意栏数的栅栏加密解密脚本算法分析

时间:2018-08-02 23:02:26      阅读:512      评论:0      收藏:0      [点我收藏+]

标签:指定   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!