我正在写一个代码,我想计算密文中使用字母的频率,然后将其与ETAOINSHRDLCUMWFGYPBVKJXQZ
进行比较。然后我想让它建议一个密钥使用解密时,但我不能从我目前的编码输出。你知道吗
englishLetterFreq = {'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'}
ETAOIN = 'ETAOINSHRDLCUMWFGYPBVKJXQZ'
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def getLetterCount(message):
letterCount = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0, 'P': 0, 'Q': 0, 'R': 0, 'S': 0, 'T': 0, 'U': 0, 'V': 0, 'W': 0, 'X': 0, 'Y': 0, 'Z': 0}
for letter in message.upper():
if letter in LETTERS:
letterCount[letter] +=1
print('LETTERS {}'.format(letterCount))
return letterCount
def getItemAtIndexZero(x):
return x[0]
def getFrequencyOrder(message):
letterToFreq = getLetterCount(message)
letterToFreq = {}
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, reverse=True)
freqToLetter[freq] = ".join(freqToLetter[freq])"
freqPairs = list(freqToLetter.items())
freqPairs.sort(key=getItemAtIndexZero, reverse=True)
freqOrder = []
for freqPair in freqPairs:
freqOrder.append(freqPair[1])
return".join(freqOrder)"
def englishFreqMatchScore(message):
freqOrder = getFrequencyOrder(message)
matchScore = 0
for commonLetter in ETAOIN[:6]:
if commonLetter in freqOrder[:6]:
matchScore += 1
for uncommonLetter in ETAOIN[-6:]:
if uncommonLetter in freqOrder[-6:]:
matchScore += 1
print("{}",englsishFreqMatchScore)
return matchScore
请看以下内容。我很抱歉没有纠正你的代码,但有时重写一些东西比纠正它容易。有什么不清楚的尽管问我。你知道吗
令人失望的是(但并不奇怪),每次运行此代码时,可能会得到不同的结果。这是不允许的,但发生这种情况的原因是
collections.Counter().most_common()
当to项具有相同的计数时,它以任意顺序返回它们。但是,随着要加密的文本大小的增加,两个字母的计数完全相同的可能性也就消失了。将n
设置为1也有帮助(代码为ceaar键提供了一个建议)。你知道吗相关问题 更多 >
编程相关推荐