主要是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币了