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

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语言2. 编写栅栏密码算法加密、解密编码程序。。求急啊

CTF密码学密文脚本解密及WP(凯撒解密)

C++代码 递归算法 n个数的全排列 (是任意的,可不连续) 要求: 提示输入数的个数n 然后提示输入这n个

FFT频谱分析(补零频谱泄露栅栏效应加窗细化频谱混叠),MatlabC语言代码

网格概念 Gutter