deffrequency_attack(c:str):
target=0
best=0
margin=1
best_k=0
standard_frequency=[0.08167,0.01492,0.02782,0.04253,0.12702,0.02228,0.02015,0.06094,0.06966,0.00153,0.00772,0.04025,0.02406,0.06749,0.07507,0.01929,0.00095,0.05987,0.06327,0.09056,0.02758,0.00978,0.02360,0.00150,0.01974,0.00074]for i in standard_frequency:
target+=i**2
frequency=frequency_finding(c)for k inrange(26):sum=0for f inrange(26):sum+=frequency[f]*standard_frequency[(f-k)%26]ifabs(sum-target)<margin:
margin=abs(sum-target)
best_k=k
best=sum
m=shift_cipher_decryption(c,best_k)return m
其他调用库和调用函数
import re
defletters_finding(text:str):
ret=""# 将所有字母替换为小写字母
text=text.lower()# 使用正则表达式查找所有字母
letters = re.findall(r'[a-zA-Z]', text)for letter in letters:
ret+=letter
return ret
deffrequency_finding(letters:str):
frequency=[0]*26
cnt=0
ord_a=ord('a')# 计算每个字母的频数for letter in letters:
frequency[ord(letter)-ord_a]+=1
cnt+=1# 计算每个字母的频率for i inrange(26):
frequency[i]/=cnt
return frequency
defshift_cipher_encryption(m:str,k:int):
letters=letters_finding(m)
cipher=""for letter in letters:
cipher+=chr(((ord(letter)-ord('a')+ k)%26)+ord('a'))return cipher
defshift_cipher_decryption(c:str,k:int):return shift_cipher_encryption(c,-k)