我试图根据字母替换来解密我的密文(没有固定的偏移量)。我的目标是找到钥匙。
例如:
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
答案 0 :(得分:0)
在您的半解密文本中找到一个包含至少一个未知字母的单词,并且可能会被解密为英语词典中尽可能少的单词。对每种可能性递归重复此过程。这称为递归回溯,查找它。
例如,理想的情况是如果纯文本包含单词c
,并且您正确地替换了第一部分中最常见的字母(根据您的示例判断,事实并非如此 - 您将需要更长的纯文本)。然后除了theatrixs
之外,每个字母都是已知的,即它看起来像x
。通过字典查看,您会发现只有一个单词在这些位置中包含所有已知字母,因此您可以确保某些字母(例如c
)可以替换为theatrims
并且你取得了一些进展。
但是假设x -> m
是一个真正的英语单词,你无法找到任何其他单词来明确解密。然后,您必须遍历各种可能性,并递归地重复每个过程。您可以尝试False
并根据此假设继续解密文本。在某个地方,这可能会让你有一个单词,你可以解密成任何英语(这假设不会有任何名称,模糊的行话,或拼写错误,这是一个问题)。提出异常或返回x -> c
,这样你就可以冒泡调用堆栈,直到可以尝试其他可能的密钥,即x -> m
或假设chntrain
内的某种未尝试的可能性。如果您设法解密整个文本,请将其附加到某个列表并继续迭代其他可能的替换,因为其他答案可能是可能的。
答案 1 :(得分:0)
polyalphabetical cypher的解密并不容易。特别是如此短的文本(如果加密了800页的小说,你的解密会更好)。
首先,您需要某种指标来衡量一个好的关键字。一种方法是使用字母频率。您还可以使用bigrams或trigrams。或者可以将解密的文本与最常用的单词列表进行比较。可能是所有这些的混合物。
接下来,您需要一种“智能”方式来测试关键候选者。你的密码有26个! (约4e26)可能的键。您不希望以abcde...z
开头并进行所有排列。也许从纯粹基于字母频率的算法开始,而不是去simulated annealing
如果你不想解密一条消息(并且你不能自动完成它的挑战),那么手动操作可能会更好。从基于字母频率的解密文本开始,您会在输出中看到text
和the
- 听起来很合理。取ehtx
为正确,忽略其他。现在输出中只有一个单词t_
。这很可能是to
,我们得到了o
。好的,让我们看看:__to
..也许into
?你明白了。
答案 2 :(得分:0)
本教程可能会帮助您破解替换密码:https://inventwithpython.com/hacking/chapter18.html