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

凯撒密码:移位与暴力枚举
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 的密码学实验服务
- 攻击过程完整:密钥长度推断与逐位破解两步都有代码与输出。
- 统计量可复现:重合指数、卡方检验的实现与中间结果全部保留。
- 讨论有深度:从密钥空间、密钥重用讲到现代密码的设计目标。
- 报告规范:实验步骤、结果、分析、结论四段式完整。
需要 密码学 实验报告 代写 支持,可以联系我们,或查看 留学生计算机代写服务 的完整范围。
