凱撒加密【加密+暴力破解+文本單詞匹配】


要求:

1 實現指定秘鑰的凱撒密碼加密

2 已知秘鑰解密

3 未知秘鑰,采用暴力破解

4 對破解出的密碼,與單詞詞典比對,找出明文的那一條,得到加密的秘鑰

 

采用python實現

報告+代碼鏈接

鏈接:https://pan.baidu.com/s/1aOIhnLFIy36Y05AnrCz8pw
提取碼:zulz

Caesar_encryption.py

MAX_KEY_SIZE = 26

def getMode():
    while True:
        print('請選擇加密或解密模式,或者選擇暴力破解:')
        print('加密:encrypt(e)')
        print('解密:decrypt(d)')
        print('暴力破解:brute(b)')
        mode = input().lower()
        if mode in 'encrypt e decrypt d brute b'.split():
            return mode
        else:
            print('請輸入"encrypt"或"e"或"decrypt"或"d"或"brute"或"b"!')

def getMessage():
    print('請輸入你的信息:')
    return input()

def getKey():
    key = 0
    while True:
        print('請輸入密鑰數字(1-25)')
        key = int(input())
        if (key >=1 and key <= MAX_KEY_SIZE):
            return key

def getTranslatedMessage(mode, message, key):
    if mode[0] == 'd':
        key = -key   #如果是解密的 就反過來
    translated = ''
    for symbol in message:
        if symbol.isalpha(): #是否都是字母
            num = ord(symbol) #得到字符symbol對應的ASCII碼
            num += key  #解密出對應的ASCII碼
            if symbol.isupper():
                if num > ord('Z'):
                    num -= 26
                elif num < ord('A'):
                    num += 26
            elif symbol.islower():
                if num > ord('z'):
                    num -= 26
                elif num < ord('a'):
                    num += 26

            translated += chr(num)  #與ord對應  將碼轉字符
        else:
            translated += symbol  #不是字母的位置就直接添加了

    write_file(translated,"cipher.txt")
    return translated

def write_file(str,filename):
    with open(filename,'w') as fp:
        fp.write(str)



mode = getMode()
message = getMessage()

if mode[0] != 'b':
    key = getKey()

print('你要翻譯的信息是:')
if mode[0] != 'b':
    print(getTranslatedMessage(mode, message, key))
else:
    for key in range(1, MAX_KEY_SIZE + 1):
        print(key, getTranslatedMessage('decrypt', message, key))

  

Caesar_ Decrypt.py

########################功能#######################
#1、文件讀入4萬個常用單詞、密文
#2、解密后存文件
#3、cipher 是存的原始密文  cipher_no 是把原始密文的標點符號過濾后的密文
########################程序###########################
import time
#存放100常用單詞的文本
WORDS_FILE_NAME = 'diction.txt'
#WORDS_FILE_NAME = 'words.txt'
#加密所用的對照表
KEY_FILE_NAME = 'duizhao.txt'
#存放密文的文本
CIPHER_FILE_NAME = 'cipher.txt'
#存放明文的文本
PLAIN_FILE_NAME = 'plain.txt'

letters = 'abcdefghijklmnopqrstuvwxyz'

#讀入一個文本
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,'w') as fp:
        fp.write(str)

#根據秘鑰加密
def encrypt(key,textFileString):
    lines = ''
    #讀入待加密文本
    lines = read_file(textFileString)
    lines.lower()
    #讀入對應轉換表
    letters1 = '' #選擇對應的轉換表
    with open(KEY_FILE_NAME, 'r') as fp1:
        for line in fp1:
            key -= 1
            if key == -1:  #找到key那一行
                letters1 += line

    #進行加密
    cstring = ''
    length = len(lines)
    for i in range(0, length):
        if lines[i] >= 'a' and lines[i] <= 'z':
            for j in range(0, 26):
                if lines[i] == letters[j]:  #letters = 'abcdefghijklmnopqrstuvwxyz'
                    cstring += letters1[j]  #進行相應位的替換
        else:
            cstring += lines[i]
    return cstring


#根據指定的秘鑰解密
def decipher1(key,textFileString):
    #從文件讀入數據
    lines = ''
    cstring = ''#密文結果
    lines = read_file(textFileString)
    #全部轉換為小寫字母
    lines.lower()
    #根據key進行解密
    letters1 = ''
    with open(KEY_FILE_NAME,'r') as fp1:
        for line in fp1:
            key += 1
            if key == 27:
                letters1+=line
    #開始解密
    length  = len(lines)
    for i in range(0,length):
        if lines[i]>='a' and lines[i] <= 'z':
            for j in range(0, 26):
                if lines[i] == letters[j]:
                    cstring+=letters1[j]
        else:
            cstring += lines[i]
    return cstring

#根據常用詞匯表解密
def decipher2(textFileString):
    #讀入一百個單詞
    words = read_file(WORDS_FILE_NAME).split('\n')  #讀取文件所有內容 並以回車分詞
    max = 0;
    index = 0;
    #暴力破解選擇一個秘鑰
    filename_no = read_file(textFileString).replace(',','')
    filename_no = filename_no.replace('.','')
    filename_no = filename_no.replace(':','')
    filename_no = filename_no.replace('"','')
    filename_no = filename_no.replace('?','')
    write_file(filename_no,'cipher_no.txt')  #符號替換完 存入_no
    print("暴力破解的所有結果:")
    for i in range(1,26):
        pstring = decipher1(i,'cipher_no.txt')
        print("秘鑰為%d"%i,"時,解密的結果:",pstring)
        plainWords = pstring.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("經過詞典比對,最終得出正確的明文:")
    print('破解秘鑰是%d'%index)
    # print('單詞個數%d',length)
    print('單詞的匹配程度{}%'.format(float('%.2f'%(max*100/length))))
    #寫入文件
    str = decipher1(index,textFileString)
    write_file(str,PLAIN_FILE_NAME)
    return decipher1(index,textFileString)

def main():
    print('主程序入口')
    start_time = time.time()
    print('解密后的結果:\n'+decipher2('cipher.txt'))  #解密
    #print('加密后的結果:\n'+encrypt(3, 'D:\\2018\Python_Learning\pythonlearning\\plain.txt')) #加密
    end_time = time.time()
    run_time = end_time-start_time
    print('程序的運行時間為:{}'.format(run_time))

if __name__ == '__main__':
    main()

  有一些txt見網盤鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM