用python实现困在栅栏中的凯撒解密

试试就试试

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])

猜你喜欢

转载自blog.csdn.net/qq_46456049/article/details/109711255
今日推荐