古典密码实验报告:凯撒、维吉尼亚与频率分析

古典密码实验从替换密码到频率分析的四条主线

密码学 实验报告 代写 这类作业有个共同点:代码都很短,分数差距全在报告上。加分的关键在于写清楚「你是怎么攻破它的」,而不是只贴加解密函数。

古典密码实验从替换密码到频率分析的四条主线

凯撒密码:移位与暴力枚举

def caesar(text, shift, mode='encrypt'):
    out = []
    for ch in text:
        if ch.isalpha():
            base = ord('A') if ch.isupper() else ord('a')
            s = shift if mode == 'encrypt' else -shift
            out.append(chr((ord(ch) - base + s) % 26 + base))
        else:
            out.append(ch)
    return ''.join(out)

密钥空间只有 25 种(移位 0 无意义)。因此攻击方式不是频率分析,而是枚举全部 25 种可能并人工辨认:

for k in range(1, 26):
    print(k, caesar(cipher, k, 'decrypt')[:60])

报告里要说明:这个暴力枚举耗时几乎为零,因此凯撒密码在现代意义下没有密钥强度可言。这里可以引出「密钥空间大小」这个概念——25 与 2^128 的差别。

维吉尼亚密码:多表替换

def vigenere(text, key, mode='encrypt'):
    out, ki = [], 0
    for ch in text:
        if ch.isalpha():
            base = ord('A') if ch.isupper() else ord('a')
            k = ord(key[ki % len(key)].upper()) - ord('A')
            s = k if mode == 'encrypt' else -k
            out.append(chr((ord(ch) - base + s) % 26 + base))
            ki += 1
        else:
            out.append(ch)
    return ''.join(out)

维吉尼亚密码的密钥空间远大于凯撒——但它的弱点不在于密钥空间,而在于密钥会重复。这直接导出了下面的攻击路径。

攻击路径:先推密钥长度,再逐位破解

第一步:确定密钥长度

两种方法,报告里都应该做并对比:

方法一:卡西斯基测试(Kasiski Examination)

在密文中寻找重复出现的字符串,记录它们之间的距离,取这些距离的公因数。密钥长度很可能是这些公因数的最大公约数因子。

import re
from math import gcd
from functools import reduce

def kasiski(cipher, min_len=3):
    d = {}
    for i in range(len(cipher) - min_len + 1):
        seq = cipher[i:i+min_len]
        if seq.isalpha():
            d.setdefault(seq, []).append(i)
    distances = []
    for seq, pos in d.items():
        if len(pos) > 1:
            for a, b in zip(pos, pos[1:]):
                distances.append(b - a)
    return reduce(gcd, distances) if distances else None

方法二:重合指数(Index of Coincidence)

把密文按假设的密钥长度分成若干组,分别计算每组的 IC。当假设长度正确时,每组退化为单表替换,IC 接近英文的 0.066;假设错误时接近随机分布的 0.038。

def ic(text):
    text = [c for c in text.upper() if c.isalpha()]
    n = len(text)
    if n < 2: return 0
    from collections import Counter
    return sum(v * (v - 1) for v in Counter(text).values()) / (n * (n - 1))

def guess_keylen(cipher, max_len=20):
    res = []
    for L in range(1, max_len + 1):
        groups = [cipher[i::L] for i in range(L)]
        avg = sum(ic(g) for g in groups) / L
        res.append((L, round(avg, 4)))
    return sorted(res, key=lambda x: -x[1])[:5]

第二步:逐位破解密钥

确定长度 L 后,把密文按位置分组,每组做一次单表频率分析——用卡方统计量或相关系数与英文字母频率表对比:

ENG_FREQ = {'A':8.17,'B':1.49,'C':2.78,'D':4.25,'E':12.70,'F':2.23,'G':2.02,
            'H':6.09,'I':6.97,'J':0.15,'K':0.77,'L':4.03,'M':2.41,'N':6.75,
            'O':7.51,'P':1.93,'Q':0.10,'R':5.99,'S':6.33,'T':9.06,'U':2.76,
            'V':0.98,'W':2.36,'X':0.15,'Y':1.97,'Z':0.07}

def crack_shift(group):
    best = None
    for k in range(26):
        shifted = caesar(group, k, 'decrypt').upper()
        shifted = [c for c in shifted if c.isalpha()]
        if not shifted: continue
        from collections import Counter
        cnt = Counter(shifted); n = len(shifted)
        score = sum((cnt.get(c,0)/n - p/100)**2 for c, p in ENG_FREQ.items())
        if best is None or score < best[0]:
            best = (score, k)
    return best[1]

报告的高分点在这里:把「猜长度 → 逐位破」这个分解过程写清楚,说明为什么多表替换可以被拆成多个单表替换问题。这比贴最终明文的得分高得多。

安全性的现代讨论

实验报告结尾通常要求讨论这些古典方案为什么不安全。要点:

  • 凯撒:密钥空间 25,枚举即可破。信息论上密钥量远小于明文不确定性。
  • 维吉尼亚:密钥重复导致统计特征泄漏。密钥长度一旦被推定,单表分析即可逐位破解。
  • 一次性密码本:与密钥等长且真正随机时理论上不可破——但它要求密钥分发与明文等长,工程上不可行,且密钥不可重用。
  • 现代密码:AES 等分组密码通过混淆与扩散设计,使密文的统计特征与明文解耦,抵抗频率类攻击。

把维吉尼亚和一次性密码本放在一起对比,可以直接说明「密钥长度与重用」对安全性的决定性作用——这是这个概念在密码学中最重要的直觉。

常见扣分点

  • 只贴加解密代码,没有攻击过程。
  • 密钥长度推断步骤缺失,直接给出密钥。
  • 频率分析用肉眼观察而非统计量。
  • 未讨论安全性,或讨论只停留在「不安全」。
  • 缺少明密文对照的验证数据。

代写Pro 的密码学实验服务

  • 攻击过程完整:密钥长度推断与逐位破解两步都有代码与输出。
  • 统计量可复现:重合指数、卡方检验的实现与中间结果全部保留。
  • 讨论有深度:从密钥空间、密钥重用讲到现代密码的设计目标。
  • 报告规范:实验步骤、结果、分析、结论四段式完整。

需要 密码学 实验报告 代写 支持,可以联系我们,或查看 留学生计算机代写服务 的完整范围。

相关案例与服务

需要有人帮你把这门作业做完?

把作业要求直接发过来,通常 10 分钟内回复给出报价与交付时间。不满意不接单。

每天 09:00 – 24:00(北京时间) | hecrereed@163.com

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

需要代写帮助?

通常 10 分钟内回复

邮箱 hecrereed@163.com 填写需求,免费报价 →
每天 09:00 – 24:00(北京时间)