到目前为止,我正在尝试创建一个频率分析程序。 到目前为止我有:
`frequency_analysis = { "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 }
listing = []
letters = 'eatniroshlcdguwpbfynkvxzjq'
alphabet = 'abcdefghijklmnopqrstuvwxyz'
text = input("Please Enter text to decipher").lower()
for letter in text:
if letter.isalpha():
frequency_analysis[letter] += 1
def get_num (frequency_analysis):
return frequency_analysis[1]
unsorted_items = frequency_analysis.items()
sorted_items = sorted(unsorted_items, key = get_num)
descending = reversed(sorted_items)
descending = list(descending)
inorder = list()
for char in descending:
inorder.append(char)
for key in inorder:
if key[1] > 0:
print (key)
我们现在需要用最常用的字母交换密钥
例如。输入:你好
找频率:L,L,O,H,E
从代码顶部(字母)交换大多数频率字母。
L = E
o = A
H = T
E = n
然后按顺序放回。
outcome = TNEEA
答案 0 :(得分:4)
{HTTP_HOST}
答案 1 :(得分:0)
这里有一些代码可以执行频率分析。我注意到这基本上是paddyg建议的实现:
import collections
ALPHABET = "abcdefghijklmnopqrstuvwxyz"
ETAOIN = 'etaoinshrdlcumwfgypbvkjxqz'
def generate_caesar_key(offset):
dictionary = {}
index = 0
for letter in ALPHABET:
if index+offset >= 26:
index -= 26
dictionary.update({letter:ALPHABET[index+offset]})
index += 1
return dictionary
def switch_encode(string, key):
encoded = ""
for letter in string.lower():
if letter in key.keys():
encoded += key[letter]
else:
encoded += letter
return encoded
def switch_decode(string, key):
key = dict(zip(key.values(),key.keys()))
decoded = ""
for letter in string.lower():
if letter in key.keys():
decoded += key[letter]
else:
decoded += letter
return decoded
def switch_crack(string):
key = {}
frequent_letters = collections.Counter(string).most_common()
index = 0
for letter in frequent_letters:
if letter[0] in ALPHABET:
key[ETAOIN[index]] = letter[0]
index += 1
return key
我还包括一些其他函数来生成凯撒密码密钥,并使用密钥对事物进行编码和解码,以便可以立即使用执行频率分析的switch_crack函数。
这是字母频率分析。虽然人们当然可以对英语中的字母频率进行排名,但这远非绝对可靠。这种方法需要一个巨大的样本才能可靠地猜出交换密码的密钥。例如,我将大象的整个维基百科条目粘贴到此。它正确地猜到了一些字母,比如哪个字母是e,但是,它有一些字母切换或放错位置。
我所说的是,如果一个方法包含注意单词的方法,这个基本算法可以做得更好,更好。例如,它可以想象知道哪些组合是单词,并且如果它认识到乱码出现,则切换其字母猜测。或者它可以看一个三个字母的单词,它非常肯定以e结束并猜测它是“the”并相应地更新它的密钥。我上面的函数是使用字母进行基本频率分析的干净实现,但是只需查看字母就可以进行更好的频率分析。
答案 2 :(得分:-1)
import collections
def frequency(l):
cp=[]
maxl=[]
minl=[]
ctr = collections.Counter(l)
for i in ctr:
r=ctr[i]
cp.append(r)
p=max(cp)
q=min(cp)
#print(cp)
for i in ctr:
if ctr[i]==p:
maxl.append(i)
if ctr[i]==q:
minl.append(i)
return (sorted(minl),sorted(maxl))