修复密码解密



我正试图修复一个代码,该代码采用加密的输入文件,对字母进行频率分析,然后解密加密文本。我让它在很大程度上起作用,但密文并没有完全解密。我能得到一些关于如何修复它的建议吗?

ETAOIN = 'ETAOINSHRDLCUMWFGYPBVKJXQZ'
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
cipher = open('cipher.txt', 'r').read()

def getLetterCount(message):
alphabet = [chr(a + 65) for a in range(26)]
letter_count = dict((x, 0) for x in alphabet)
for letter in message.upper():
if letter in LETTERS:
letter_count[letter] += 1
return letter_count

def getFreq(freqPair):
return freqPair[0]

def getFrequencyOrder(message):
letterToFreq = getLetterCount(message)
freqToLetter = {}
for letter in LETTERS:
if letterToFreq[letter] not in freqToLetter:
freqToLetter[letterToFreq[letter]] = [letter]
else:
freqToLetter[letterToFreq[letter]].append(letter)
for freq in freqToLetter:
freqToLetter[freq].sort(key=ETAOIN.find)
freqToLetter[freq] = ''.join(freqToLetter[freq])
print(freqToLetter)
freq_pairs = list(freqToLetter.items())
freq_pairs.sort(key=getFreq, reverse=True)
freqOrder = []
for freqPair in freq_pairs:
freqOrder.append(freqPair[1])
return ''.join(freqOrder)

mostFrequentLetters = getFrequencyOrder(cipher)
plaintext = ""
for letter in cipher:
i = mostFrequentLetters.find(letter)
plaintext += ETAOIN[i]
print(plaintext)

这是加密的文本,将其保存在一个名为cipher.txt的文本文件中以运行代码。我只是在寻找如何改进此代码的建议。

GBTBVAGBFBYVGHQRNZNAARQFGBERGVERNFHPUSEBZUVFPUNZORENFSEBZFBPVRGLVNZABGFBYVGNELJUVYFGVERNNAQJEVGRGUBHTUABOBQLVFJVGUZROHGVSNZNAJBHYQORNYBARNGURVZYBBXNGGURFGNEFGURENLFGUNGPBZRSEBZGUBFRURNRNIRAYJBEYQFJVYYFRCNENGRORGRAUVZNAQJUNGURBHPURFBARZVTUGUVAXGURNGZBFCURERJNFZNQRGENAFNERGJVGUQRFVTAGBTVIRTIVIRARZNAVAGURRURNIRAYLBQVRFGURCRECRGHNYCERFRAPRBSGURFHOYVZRFRRAVAGURFGERRGFBSPVGRFUBJTERnggurlervsgurgneffubhyqnccrnebaravtugvangubhnaqlrnefubjjjbhyqzraoryvrirnaqqqbernaqcerfreirsbeznatrarengfbafurerzrzoenaprbsgurpvlbstbqjuvpuunqurafubjaohgrirelavtugpbzrbhggurfrraiblfbsornhglnaqytugurgurhavirfrjvgurvenqzbavfuvatfzvirgurfngnefnjnpregnvaireraprorpnhfrgubhtunyjnlfcerfragurlervanpprfvoyrohnyyanghenybowrpgfznxrn xvaqerqvzcerfvbajuragurzvaqvfbcragbgurvevasyraprangherair电子表格gurzvaqjrzrnagurvagertevglbsvzcerfvbazkrolznavsbyqanghenybowrpgfvgvfguvjuvpuqvfgvasvfurfgurfgvpxbsgvzorebsgurjbbqphggresebzgurgerbsgurcbrgurpunezvatynaqfpncrjuvpunjguvfzbeavatvfvaqhovgnoylznqrhcbsfbzrgjraglbeguveglsnezfzvyyrebjafguvfsvryqybpxrgungnaqznaavatgurjbb qynaqurbaqohgabsgurzbzbjafgurynaqypnccrgurvfncebcreglvagurrubevmbajuvpuabznaunfogurjubrrgarpnavartengrygurgrgrgrgurgurgurgurgungvfgguvfvfgurorfgcnegbsgurfrzrafsnezflrggbguvfgurvejneenaglqrrqftvirabgvgyrgbfcrNXGEHYLSRJNQHYGCREFBAFPNAFRRANGHER


以下是原始样本的输出:{329:‘AV’,299:‘B’,69:‘C’,3:‘DM’,252:‘E’,297:‘F’,432:‘G’,118:‘H’,36:‘I’,84:‘J’,2:‘K’,81:‘L’,354:‘N’,65:‘O’,107:‘P’,165:‘Q’,568:‘R’,99:‘S’,77:‘T’,281:‘U’,6:‘W’,20:‘X’,154:‘Y’,124:‘Z’}这是一个新的解决方案,它可以让患者的健康状况得到改善,并使患者的健康和安全状况得到改善


应该是这样的。一个长的、大写的、连续的句子,可以完全翻译密文。这只是它应该是什么样子的一个例子,而不是它应该实际翻译成什么:{113:"A",104:"B",31:"LC",0:"D",90:"E",114:"UF",166:"G",39:"H",13:"I",40:"J",1:"MK",122:"N",29:"O",41:"P",52:"Q",224:"R",32:"S",22:"T",120:"V",2:"W",9:"X",50:"Y",55:"Z"}毫无疑问,这是因为两个spentwimmer聚在一起,并选择了他们的艺术——他们的商业组合可能会成为多个村庄的一员。。。

关键是这是一个凯撒密码,所以OP的算法是错误的。凯撒密码只会旋转字母表,因此不需要对最常见的字母进行频率分析。

解决方案文本中最常见的字母可能是E。密码文本中最常用的字母是R,因此如果E=R,则凯撒密码如下,其中字母表被旋转以与R对齐:

NOPQRSTUV... -> ABCDEFGHI...

以下是查找最常见密码并翻译密码的代码。由于这可能是家庭作业,我将把它留给OP来编写,而不需要导入或使用内置的str.maketransstr.translate:

import string
LETTERS = string.ascii_uppercase
with open('cipher.txt') as f:
cipher = f.read()
most_common = max(LETTERS, key=cipher.count) # This letter is probably E
# find the rotation as the difference between ordinals of most common and E
# modulo 26 to give a number from 0-26.
rotation = (ord(most_common) - ord('E')) % 26
# Built the translation dictionary
caesar = LETTERS[rotation:] + LETTERS[:rotation]
translation = str.maketrans(caesar,LETTERS)
print(cipher.translate(translation))

输出:

要进入OSOLIOTUDEEAMNEDStoreTIRESMUCHFISCHAMBERASFROMSOCIETYIAAMNOTSOLITARYHILLSTIREADANDWRITETHOUGHNOBODYSWITHMEBUTIFAMANWOLDBEALONELETHLOKATHESTARSTHERAYSTHATTCOMETHOSHEAVENLYWORLDSWILLseparateBETHWENHIMANDWHETOUCHESONETHETHHETHOUCHESONEIGHNOBODY SWITHMEButIFMANWONDBEALONETHLOKATHSTARSTHERaySTHATTOMTOHOWEAVENWORLDSWILL在院子里,这些星星应该出现在家里的每一个角落,而这些表演会让人相信,在美丽的环境中,每天晚上都会出现的星星的存在,并在薄膜中保存它们的能量我们也看到了同样的情况,这是因为他发现所有疱疹病毒感染的安全性,而不是因为对最底层的人来说,这些病毒反映了当我们体内的病毒达到峰值时,最好的时间是多小时,也反映了孩子们的复杂性这是一个很好的证据,证明了从森林砍伐者的树枝到今天早上看到的破坏性景观可能是两个多世纪的,或者是一个手臂微笑的人在他的田地里锁住了一块很长的林地,但没有一个人认为那里的景观在水平面上是财产,而这个水平面上没有任何一个人可以把所有的东西都放在一起,这是男人农场最好的部分,因为他保证会给我们发通知事实上很少有成年人能看到大自然

最新更新