python实现栅栏加解密(网络安全课程实验)

主要是Java的快忘完了,又正在学python,所以就拿python来试试手

课本上对栅栏加密说的太复杂了,用矩阵在那换来换去,用数组实现吗?no!

再观察观察你就会发现是有规律的,如2栏,其实就是对字符串从头开始取单个字符,每次跳2,然后再从第一个字符取,每次还是跳2;依此类举。。。。

代码简单应该没什么看不懂的地方

根据100个单词破解的那个具体跟我凯撒解密的思路一样,如有问题可以看这篇:https://blog.csdn.net/jiachang98/article/details/83149474

代码

#栅栏密码的加密、有秘钥解密、无秘钥解密
#存放100常用单词的文本
WORDS_FILE_NAME = 'D:\\2018\Python_Learning\pythonlearning\words.txt'
#定义密文文件
CIPHER_FILE_NAME = 'D:\\2018\Python_Learning\pythonlearning\SLCipher.txt'
#定义解密后的输出文件
PLAIN_FILE_NAME = 'D:\\2018\\Python_Learning\\pythonlearning\\SLPlain.txt'

#读文件的操作
def read_file(filename):
    lines = ''
    with open(filename,'r') as fp:
        for line in fp:
            lines += line
    return lines

#写文件的操作
def write_file(str,filename):
    with open(filename,'a') as fp:
        fp.write(str)

#去除空格,并返回空格所在位置
def remove_space(str):
    # 记录字符串中空格的位置
    length = len(str)  # 字符串的长度
    list_space = []  # 存放字符串中空格的位置
    for i in range(0, length):
        if str[i] == ' ':
            list_space.append(i)
    str = str.replace(' ', '')  # 去掉字符串中所有的空格
    len_space = len(str)  # 去掉空格后的长度
    return [length,list_space,len_space,str] #返回去空前的长度,空格所在位置,去空后的长度

#根据空格所在位置,还原空格
def add_space(str,space_list):
    num_space = len(space_list)
    for i in range(0,num_space):
        str = str[:(space_list[i])]+' '+str[(space_list[i]):]
    return str

#根据key加密
def encrypt(key,filename):
    str = read_file(filename)
    result = remove_space(str)#0:去空前的长度,1:空格所在位置,2:去空后的长度3:去空后的字符
    str = result[3]
    str_en = ''  # 加密后的字符串
    if result[2]%key==0:
        for i in range(0,key):
            for j in range(i,result[2],key):
                str_en += str[j]
    else:
        n = key-(result[2]%key) #记录缺少多少个字符
        str += ('t'*n)
        for i in range(0,key):
            for j in range(i,result[2]+n,key):
                str_en += str[j]
    #加上空格
    str_en = add_space(str_en,result[1])
    return str_en

#根据key解密
def decipher1(key,filename):
    str = read_file(filename)
    result = remove_space(str)  # 0:去空前的长度,1:空格所在位置,2:去空后的长度3:去空后的字符
    key = result[2]//key
    return encrypt(key,filename)

#根据常用的100个单词解密
def decipher2(filename):
    str = read_file(filename)
    result = remove_space(str)  # 0:去空前的长度,1:空格所在位置,2:去空后的长度3:去空后的字符
    #统计一共可能有多少种key
    set_key = set() #定义一个集合存放key
    for i in range(1,result[2]):
        if result[2]%i==0 and i!=1:
            set_key.add(i)
    # 读入一百个单词
    words = read_file(WORDS_FILE_NAME).split(' ')
    max = 0;
    index = 1;
    #开始暴力破解,匹配
    for i in set_key:
        str_en = decipher1(i,filename)
        plainWords = str_en.split(' ')
        # 对比
        length = len(plainWords)
        temp = 0
        for j in range(0, length):
            if plainWords[j] in words:
                temp += 1
        if temp > max:
            max = temp
            index = i
    print('破解秘钥是%d' % (index))
    return decipher1((index),filename)

#主方法
def main():
    print('#'*20)
    print('主函数从此开始')
    print('#' * 20)
    # print('加密后的结果'+ encrypt(4,PLAIN_FILE_NAME))
    # write_file(encrypt(4,PLAIN_FILE_NAME),CIPHER_FILE_NAME)
    print('解密后的结果' + decipher2(CIPHER_FILE_NAME))

if __name__ == '__main__':
    main()

我把凯撒加解密和栅栏加解密的相关代码、文本、100个单词上传到我的资源页了,主要这CSDN资源分享至少要设置1C币而不能免费分享,我也很无奈,所以我只能收大家1C币了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello689

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值