初入密码学之置换加密与暴力破解

2019-09-21   92 次阅读


请注意,本文编写于  579  天前,最后编辑于  140  天前,内容可能已经不具有时效性,请谨慎参考。

摘要:此为学习现代密码学的一次作业,能进行不是较大文本量的txt文本周期性置换加密,并进行密文的暴力破解。

文件解释

1.将文件放在同一个python文件夹下使用

2.encryption.py为加密程序,decrypt为暴力破解程序

3.plain.txt为初始待加密文本,cipher.txt为加密后生成的文本,DecryptWoed.txt为暴力破解后生成的文本。

4.若要运行可删除 (3)中的三个文本重新运行。

加密程序运行解释

1.首先输入置换加密密钥的位数。

2.输入置换加密的密钥。若加密密钥为(1 5 6 2 3 )则将其代换后输入 531462

3.将待加密文本重命名为plain.txt

4.等待加密后生成cipher.txt

解密程序运行解释

1.输入密钥长度即可进行暴力破解

2.采用的是深度搜索来遍历密钥的所有可能。

3.等待解密后生成DecryptWoed.txt。

4.其中所以可能会在DecryptWoed.txt以回车进行分隔。

加密程序

import re

def translate():
    #将txt文本存入word1
    file = open('plain.txt','r',encoding='utf-8')
    word1 = file.read()
    file.close
    #将txt文本转换只剩下英文单词
    word=''
    word2 = re.findall('[a-zA-Z]+', word1)
    for i in word2:
        word = word + i
    return word

def encryption(wordlist,deltalist):
    #进行置换加密
    NewWordlist = []
    for i in wordlist:
        con = ''
        str = i
        for j in deltalist:
            con = con + str[ j -1 ]
        NewWordlist.append(con)
    return NewWordlist



def save(word):
    file2 = open('cipher.txt','a',encoding='utf-8')
    for i in word:
        file2.write(i)

    file2.close()

def main():
    deltasize = int(input("请输入您的密钥位数:"))
    delta = input("请输入您的密钥:")
    deltalist=[]
    for j in delta:
        deltalist.append(int(j))

    #将word存入wordlist列表中
    word = translate()
    wordlist = []
    j = 0
    str = ''
    for i in word :
        if(j < deltasize):
            str = str +i
            j=j+1
        if(j == deltasize ):
            wordlist.append(str)
            j = 0
            str = ''

    for i in wordlist:
        str = i
        print(str)
    NewWordlist = []
    NewWordlist = encryption(wordlist,deltalist)
    #用save函数存入cipher.txt中
    save(NewWordlist)


main()

暴力破解代码

def save(word):
    #存储
    file2 = open('DecryptWoed.txt','a',encoding='utf-8')
    for i in word:
        file2.write(i)
    file2.write(("\n"))
    file2.close()

def decrypt(wordlist,deltalist):
    #进行置换解密
    NewWordlist = []
    for i in wordlist:
        con = ''
        str = i
        for j in deltalist:
            con = con + str[ j -1 ]
        NewWordlist.append(con)
    return NewWordlist

def DFS(p,delta,token,newdelta,wordlist):
    #深度搜索密钥的所以可能性
    if p == len(delta):
        print(newdelta)
        save(decrypt(wordlist,newdelta))
        return


    for index in range(len(delta)):
        if token[index] == True:
            newdelta[p] = delta[index]
            token[index] = False
            DFS(p+1,delta,token,newdelta,wordlist)
            token[index] = True


def main():
    deltasize = int(input("输入密钥位数:"))
    delta =[]
    for i in range(1, deltasize + 1):
        delta.append(i)
    token = [True for i in range(len(delta))]   #用来深度搜索判断
    newdelta = ['' for i in range(0, len(delta))]  #引用来存储一次深度优先后的结果
    file = open('cipher.txt','r',encoding='utf-8')
    word = file.read()
    #将word存入wordlist列表中
    wordlist = []
    j = 0
    str = ''
    for i in word :
        if(j < deltasize):
            str = str +i
            j=j+1
        if(j == deltasize ):
            wordlist.append(str)
            j = 0
            str = ''

    DFS(0,delta,token,newdelta,wordlist)


main()

本文由 hongCYu 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
原文链接:https://hongcyu.cn/posts/cryptography-1.html
最后更新于:2020-12-03 10:13:22

Coffee