试试就试试
import enchant
# import time
import math
# 设置英文
d = enchant.Dict("en_US")
# 读取键盘输入
s = input("请输入加密后的密文:")
# 记录每一次是单词的准确率及栏数和key
word_num_list = {
}
# 检查句子中的单词是否有效
def words_checked(s, count,key):
# 句子中总的单词率
correct_rate = 0.0
# 表示i个字母为一个单词
for i in range(3, 6):
words_list = []
# 以空格分割单词
# 文本单词个数
text_len = len(s) // i
for j in range(text_len):
words_list.append(s[j*i:i*(j+1)])
# 检查每一个单词是否有效
bool_word = map(d.check, words_list)
current_correct_rate = sum(bool_word) / text_len
print(current_correct_rate)
# 总的是单词的概率
correct_rate += current_correct_rate
# 记录句子中是单词的概率及栅栏数和key
word_num_list[correct_rate] = "栏数为%s--key为%s时--准确率为:%s" % (count,key,correct_rate)
# print(correct_rate)
if correct_rate > 0.5:
return True
return False
def file_write(one_str):
with open("./pass.txt", 'a') as f:
f.write(one_str)
def fn(count,s):
# 密钥
key = 0
# 找到正确key与明文
# 记录正确的明文和密钥
# vispass = ""
while True:
# 记录每一个key解密后的结果
ss = ""
if words_checked(s,count,key):
vispass = "%s栏--密钥key为%s,明文结果为:%s" % (count,key,s)
print(vispass)
return True;
for c in s:
# 替换每一个字母
if c != " ":
# 将每一个字母的ascii码值减一
dig = ord(c)-1
# 当解密结果小于A时,替换成Z
if (dig < 65):
dig = 90
# 当解密结果小于a时,替换成z
elif(90<dig<97):
dig = 122
# 将字符追加到ss字符串
ss += chr(dig)
else:
# 当字符为空格时,不解密,直接连接上
ss += " "
# 将s替换成这次接密的结果
s = ss
key += 1
# 退出循环
if key > 25:
break
out = ("%s栏---当key=%s时,解密结果为: %s" % (count, key, s))
file_write(out+'\n')
print(out)
# time.sleep(0.1) # 让程序睡一秒,使我们可以看到每一次解密的结果
# print(vispass)
def zhalan():
zhacount = []
fn(1,s)
# 字符串总长度
lenth = len(s)
l = int(math.sqrt(lenth))
# 计算可能的栏数
for i in range(2,l+1):
if lenth % i == 0:
zhacount.append(i)
print(zhacount)
# 遍历每一栏
for i in zhacount:
newstr = ""
# 计算间隔
ge = lenth // i
# 求出新字符串
# j次数
for j in range(ge):
# k 是当前栏数
for k in range(i):
newstr += s[j+ge*k]
zha_str = "%s栏解密后为:%s" % (i, newstr)
file_write(zha_str+'\n')
print(zha_str)
if fn(i,newstr):
return;
if __name__=="__main__":
zhalan()
# 取出最大准确率及对应的栏数
max_rate = max(word_num_list)
print("最可能的匹配为:",word_num_list[max_rate])
稍微的调整
import enchant
# import time
import math
# 设置英文
d = enchant.Dict("en_US")
# 读取键盘输入
s = input("请输入加密后的密文:")
s = s.lower()
# 记录每一次是单词的准确率及栏数和key
word_num_list = {
}
# 检查句子中的单词是否有效
def words_checked(s, count,key):
# 句子中总的单词率
correct_rate = 0.0
# 表示i个字母为一个单词
for i in range(3, 6):
words_list = []
# 以空格分割单词
# 文本单词个数
# text_len = len(s) // i
# for j in range(text_len):
# words_list.append(s[j*i:i*(j+1)])
text_len = len(s) - i
for j in range(text_len):
words_list.append(s[j:j+i])
# 检查每一个单词是否有效
bool_word = map(d.check, words_list)
current_correct_rate = sum(bool_word) / text_len
print(current_correct_rate)
# 总的是单词的概率
correct_rate += current_correct_rate
# 记录句子中是单词的概率及栅栏数和key
word_num_list[correct_rate] = "栏数为%s--key为%s时--准确率为:%s,解密后为:%s" % (count, key, correct_rate, s)
# print(correct_rate)
if correct_rate > 0.5:
return True
return False
def file_write(one_str):
with open("./pass.txt", 'a') as f:
f.write(one_str)
def fn(count,s):
# 密钥
key = 0
# 找到正确key与明文
# 记录正确的明文和密钥
# vispass = ""
while True:
# 记录每一个key解密后的结果
ss = ""
if words_checked(s,count,key):
vispass = "%s栏--密钥key为%s,明文结果为:%s" % (count,key,s)
print(vispass)
return True;
for c in s:
# 替换每一个字母
if c != " ":
# 将每一个字母的ascii码值减一
dig = ord(c)-1
# 当解密结果小于A时,替换成Z
if (dig < 65):
dig = 90
# 当解密结果小于a时,替换成z
elif(90<dig<97):
dig = 122
# 将字符追加到ss字符串
ss += chr(dig)
else:
# 当字符为空格时,不解密,直接连接上
ss += " "
# 将s替换成这次接密的结果
s = ss
key += 1
# 退出循环
if key > 25:
break
out = ("%s栏---当key=%s时,解密结果为: %s" % (count, key, s))
file_write(out+'\n')
print(out)
# time.sleep(0.1) # 让程序睡一秒,使我们可以看到每一次解密的结果
# print(vispass)
def zhalan():
zhacount = []
fn(1,s)
# 字符串总长度
lenth = len(s)
# l = int(math.sqrt(lenth))
l = lenth
# 计算可能的栏数
for i in range(2,l+1):
# if lenth % i == 0:
zhacount.append(i)
print(zhacount)
# 遍历每一栏
for i in zhacount:
newstr = ""
# 计算间隔
ge = lenth // i
# 求出新字符串
# j次数
for j in range(ge):
# k 是当前栏数
for k in range(i):
newstr += s[j+ge*k]
zha_str = "%s栏解密后为:%s" % (i, newstr)
file_write(zha_str+'\n')
words_checked(zha_str, i, 0)
print(zha_str)
if fn(i,newstr):
return;
if __name__=="__main__":
zhalan()
# 取出最大准确率及对应的栏数
max_rate = max(word_num_list)
print("最可能的匹配为:",word_num_list[max_rate])