针对移位密码的频率攻击——python代码实现

主函数

def frequency_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 in range(26):
        sum=0
        for f in range(26):
            sum+=frequency[f]*standard_frequency[(f-k)%26]
        if abs(sum-target)<margin:
            margin=abs(sum-target)
            best_k=k
            best=sum
    m=shift_cipher_decryption(c,best_k)
    return m

其他调用库和调用函数

import re

def letters_finding(text:str):
    ret=""
    # 将所有字母替换为小写字母
    text=text.lower()
    # 使用正则表达式查找所有字母
    letters = re.findall(r'[a-zA-Z]', text)
    for letter in letters:
        ret+=letter
    return ret

def frequency_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 in range(26):
        frequency[i]/=cnt
    return frequency

def shift_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

def shift_cipher_decryption(c:str,k:int):
    return shift_cipher_encryption(c,-k)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值