Python Brute Force解密字母替换

时间:2015-10-22 08:37:08

标签: python encryption brute-force

我试图根据字母替换来解密我的密文(没有固定的偏移量)。我的目标是找到钥匙。

例如:

a -> g
b -> a
c -> k

这是我的明文:

  

直到现代密码学几乎完全引用   加密是转换普通信息的过程   变成难以理解的文字

我生成一个随机替换并得到这样的东西:

  

qjnyi teuvoj nytvh mocpnelorpkc ovdvoovu ritehn vwmiqhyfvic ne   vjmocpnyej skymk yh nkv poemvhh ed mejfvonyjl eouyjroc yjdeotrnyej   yjne qjyjnviiylyxiv nvwn

规则:

  
      
  • 纯文本只包含较低的字母a..z
  •   
  • 空格" "没有加油
  •   
  • 英文
  •   

我想当我使用英文字母频率时,我可以用最常用的字母替换加密文本中最常用的字母 链接:https://en.wikipedia.org/wiki/Letter_frequency#/media/File:English_letter_frequency_%28frequency%29.svg

但我无法解密一切。我得到这样的结果:

  

untsl midein tsmes riyptigisphy iefeiied slmist exrlussvely ti   enriyptsin whsrh ss the piiress if rinveitsng iidsnsiy snfiimstsin   snti unsntellsgsble text

我不确定如何继续下去......

import collections
import string
import random


mostUsedLetterNumbers = 9
mostUsedLetters = ['e','t','a','o','i','n','s','h','r','d','l','c','u','m','w','f','g','y','p','b','v','k','j','x','q','z']


#plain Text ---------------------------------------------------------------------------
#Lies den Text  
text = "until modern times cryptography referred almost exclusively to encryption which is the process of converting ordinary information into unintelligible text"
print "Cleartext:"
text = text.lower()
print text

#crypt with random.shuffle ---------------------------------------------------------------------------

abc = list(string.ascii_lowercase) #abcdef....+ lower letter

key = abc[:]  
random.shuffle(key);
#print (key) #this is my key I want to get in the end

e= dict(zip(abc,key))  
#print e

#print text
ct = ""

for c in text:
    #print(e[c])
    if c == ' ':
        ct = ct + " "
    else:
        ct = ct + e[c]

print "\nChippertext:\n",ct

#Count File ---------------------------------------------------------------------------

letters = collections.Counter(text)

#print letters
print "\nFound letters:"
for key,count in letters.iteritems():
    if key == '\n':
        print "newlines",count
    elif key == ' ':
        print "spaces",count
    else:
        print key, count

#del spaces and newlines
del letters['\n']
del letters[' ']
#----------------------------------------------------------------
#get letter count
topLetters = letters.most_common(mostUsedLetterNumbers)
#print topLetters

#replace letters
i=0
replacedText= ct
for i in range(0,mostUsedLetterNumbers):
    replacedText = string.replace(replacedText,topLetters[i][0],mostUsedLetters[i])

print "\nDecrypted:\n",replacedText

print "\nOriginal text:\n",text

3 个答案:

答案 0 :(得分:0)

在您的半解密文本中找到一个包含至少一个未知字母的单词,并且可能会被解密为英语词典中尽可能少的单词。对每种可能性递归重复此过程。这称为递归回溯,查找它。

例如,理想的情况是如果纯文本包含单词c,并且您正确地替换了第一部分中最常见的字母(根据您的示例判断,事实并非如此 - 您将需要更长的纯文本)。然后除了theatrixs之外,每个字母都是已知的,即它看起来像x。通过字典查看,您会发现只有一个单词在这些位置中包含所有已知字母,因此您可以确保某些字母(例如c)可以替换为theatrims并且你取得了一些进展。

但是假设x -> m是一个真正的英语单词,你无法找到任何其他单词来明确解密。然后,您必须遍历各种可能性,并递归地重复每个过程。您可以尝试False并根据此假设继续解密文本。在某个地方,这可能会让你有一个单词,你可以解密成任何英语(这假设不会有任何名称,模糊的行话,或拼写错误,这是一个问题)。提出异常或返回x -> c,这样你就可以冒泡调用堆栈,直到可以尝试其他可能的密钥,即x -> m或假设chntrain内的某种未尝试的可能性。如果您设法解密整个文本,请将其附加到某个列表并继续迭代其他可能的替换,因为其他答案可能是可能的。

答案 1 :(得分:0)

polyalphabetical cypher的解密并不容易。特别是如此短的文本(如果加密了800页的小说,你的解密会更好)。

首先,您需要某种指标来衡量一个好的关键字。一种方法是使用字母频率。您还可以使用bigramstrigrams。或者可以将解密的文本与最常用的单词列表进行比较。可能是所有这些的混合物。

接下来,您需要一种“智能”方式来测试关键候选者。你的密码有26个! (约4e26)可能的键。您不希望以abcde...z开头并进行所有排列。也许从纯粹基于字母频率的算法开始,而不是去simulated annealing

如果你不想解密一条消息(并且你不能自动完成它的挑战),那么手动操作可能会更好。从基于字母频率的解密文本开始,您会在输出中看到textthe - 听起来很合理。取ehtx为正确,忽略其他。现在输出中只有一个单词t_。这很可能是to,我们得到了o。好的,让我们看看:__to ..也许into?你明白了。

答案 2 :(得分:0)

本教程可能会帮助您破解替换密码:https://inventwithpython.com/hacking/chapter18.html