【问题标题】:Python Brute Force decryption letter substitutionPython蛮力解密字母替换
【发布时间】:2015-10-23 01:08:00
【问题描述】:

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

例如:

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

这是我的纯文本:

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

我生成一个随机替换并得到如下内容:

qjnyi teuvoj nytvh mocpnelorpkc ovdvoovu ritehn vwmiqhyfvic ne vjmocpnyej skymk yh nkv 诗vhh 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 sti unsntellsgsble 文本

我不知道如何继续下去......

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

【问题讨论】:

  • 两件事: 1. 您不太可能在如此短的样本中获得基于频率的精确匹配;和 2. 如果您一次替换每个字符,您会遇到问题(例如,假设您将所有 'a's 替换为 'b's - 如果您随后替换所有 'b's 会发生什么情况?)我建议您重构为简短的、单一用途的函数,然后单独测试每个函数。
  • 处理第二个问题的一个好方法是将所有'a's替换为'B's等等。然后将整个内容小写。
  • u这封信虽然不在前9,怎么破解成功?
  • 根据*,u 的频率:大约 3%。给定文本中的频率:2.33% - 所以:纯属运气

标签: python encryption brute-force


【解决方案1】:

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

例如,理想情况是纯文本包含单词theatrics,并且您正确替换了第一部分中最常见的字母(根据您的示例判断,实际上并非如此 - 您需要更长的纯文本)。那么除了c,每个字母都是已知的,即它看起来像theatrixs。查看字典,您会发现只有一个单词在这些位置包含所有已知字母,因此您可以确定某些字母(例如x)可以替换为c,然后您制作了一个进展不大。

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

【讨论】:

    【解决方案2】:

    polyalphabetical cypher 的解密并不容易。尤其是这么短的文本(如果你加密了一本 800 页的小说,你解密会更好)。

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】: