尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

维吉尼亚密码原理与实战破解:从卡西斯基试验到频率分析

维吉尼亚密码原理与实战破解:从卡西斯基试验到频率分析 1. 从凯撒到维吉尼亚古典密码的演进与核心价值如果你对密码学感兴趣或者玩过一些解谜游戏凯撒密码Caesar Cipher大概率是你接触的第一个加密方法。它简单、直观把字母按字母表顺序平移几位比如“HELLO”用密钥3加密就变成“KHOOR”。但它的致命弱点也显而易见密钥空间太小只有25种可能而且频率分析一打一个准。任何一个稍加训练的人看着密文里“E”字母出现最多就能八九不离十地猜出偏移量。那么在计算机诞生前的漫长岁月里人们如何追求更安全的通信维吉尼亚密码Vigenère Cipher就是那个时代一个里程碑式的答案。它不是一个简单的单表替换而是一种多表替换密码。简单说它用多个凯撒密码表根据一个关键词来动态决定对每个明文字母使用哪一个表进行加密。这直接击中了单表替换密码的命门——明文统计特性如字母频率在密文中被极大地模糊和打散了。我第一次真正“破解”维吉尼亚密码不是在教科书上而是在一个线下密室逃脱的终极谜题里。面对一段看似乱码的英文尝试凯撒移位全部失败字母频率图也杂乱无章那一刻我才切身感受到为什么它在历史上能被称作“不可破译的密码”le chiffre indéchiffrable。当然这个称号后来被证明是言过其实了但它的设计思想——通过引入周期性变化的密钥来增加密码系统的复杂度——深刻影响了现代密码学。本文的目标就是带你彻底吃透维吉尼亚密码。我们不仅会拆解它的加密解密原理更会聚焦于实战如何攻击它。我将详细阐述四种经典的攻击策略从最基础的卡西斯基试验找密钥长度到利用重合指数法验证长度并推测密钥再到频率分析的针对性应用最后是暴力破解的边界与技巧。你会发现破解它的过程本身就是一次完美的密码分析学入门实践。无论你是信息安全的学生、编程爱好者还是单纯的解谜迷掌握这套“矛与盾”的博弈都能让你对“安全”二字有更立体的认识。2. 维吉尼亚密码的加密与解密机制全解析理解攻击的前提是彻底理解防御。维吉尼亚密码的优雅之处在于其规则的简单性与效果的复杂性之间的反差。它的核心是两个要素明文、密钥和那个著名的维吉尼亚方阵。2.1 核心组件维吉尼亚方阵维吉尼亚方阵是一个26x26的表格它构成了加密的“法典”。第一行是字母表A-Z第二行是B-ZA即第一行左移一位第三行是C-ZAB以此类推直到第26行是Z-AY。这个方阵可以理解为26个不同的凯撒密码表第一行是偏移0的表明文即密文第二行是偏移1的表……第26行是偏移25的表。实际操作中我们不需要每次都画这个表。加密和解密可以归结为一个简单的数学公式将字母A-Z映射为数字0-25加密公式C_i (P_i K_i) mod 26解密公式P_i (C_i - K_i) mod 26其中P_i是明文中第i个字母的数字C_i是密文中第i个字母的数字K_i是密钥中对应位置字母的数字。mod 26表示取除以26的余数这保证了结果始终在0-25之间对应回字母表。2.2 一步步的加密过程假设我们的明文是ATTACKATDAWN拂晓进攻。 我们选一个密钥LEMON。加密步骤如下准备将明文和密钥转换为大写去除空格。明文ATTACKATDAWN 密钥LEMON。密钥对齐将密钥重复书写直到其长度与明文一致。明文: A T T A C K A T D A W N密钥: L E M O N L E M O N L E逐字母加密对每一对明文字母和密钥字母应用加密公式。A(0) L(11) 11 - LT(19) E(4) 23 - XT(19) M(12) 31 mod 26 5 - FA(0) O(14) 14 - OC(2) N(13) 15 - PK(10) L(11) 21 - VA(0) E(4) 4 - ET(19) M(12) 31 mod 26 5 - FD(3) O(14) 17 - RA(0) N(13) 13 - NW(22) L(11) 33 mod 26 7 - HN(13) E(4) 17 - R得到密文LXOPVEFRNHR你可以看到明文中重复的“AT”在位置1和4位置7和10因为对应的密钥字母不同第一次是L和O第二次是E和N被加密成了完全不同的“LX”和“EF”。这正是多表替换抵御频率分析的精髓所在。2.3 解密过程加密的逆运算拿到密文LXOPVEFRNHR和密钥LEMON解密就是逆过程密钥对齐同上。逐字母解密应用解密公式P_i (C_i - K_i) mod 26。L(11) - L(11) 0 - AX(23) - E(4) 19 - TF(5) - M(12) -7 mod 26 19 - T注意负数取模-7 26 19... 依次类推最终恢复出ATTACKATDAWN。注意在实际的古典密码应用中字母“J”有时会被等同于“I”来处理以简化方阵25个字母。但在现代的标准分析中我们通常使用完整的26字母表。确保你和通信方使用同一套约定。2.4 密钥的选择与安全性初探密钥的安全性直接决定了维吉尼亚密码的强度短密钥如果密钥很短比如只有3-5个字母它会在明文中重复很多次导致密码的“周期”很短更容易被分析。例如密钥“KEY”周期为3那么明文位置1、4、7、10...都用“K”加密这些位置的密文字母构成一个单表替换会保留频率特征。长密钥密钥越长周期越长对频率特征的打散效果越好。理想情况下如果密钥长度等于或超过明文长度且密钥是真正随机的、永不重复的那就成了“一次一密”在理论上绝对安全。但这在古典时代不具备可操作性。密钥内容避免使用有意义的单词如LEMON,SECRET因为它们可能被猜测或通过字典攻击。但即使使用随机字母串只要长度固定攻击者仍有办法。实操心得在手动计算或编写演示代码时最容易出错的地方就是取模运算尤其是在解密遇到负数时。务必确认你的编程语言或计算器的mod运算对负数的处理方式通常需要得到正余数。一个稳妥的手工计算方法是如果C_i - K_i是负数直接加上26然后再看结果。3. 攻击策略一卡西斯基试验——寻找密钥长度的蛛丝马迹破解维吉尼亚密码第一步也是最关键的一步就是确定密钥的长度。如果没有这个信息密文就像一团被多种频率表彻底搅乱的乱麻。卡西斯基试验Kasiski Examination正是为此而生它利用了一个非常直观的弱点明文中的重复片段如果恰好被重复的密钥片段加密就会产生相同的密文片段。3.1 原理为什么重复会出现让我们回顾加密公式C_i (P_i K_i) mod 26。 假设明文中从位置m开始有一个三字母片段“THE”在位置n(n m) 又出现了“THE”。 如果密钥从位置m开始的片段与从位置n开始的片段完全相同那么这两个“THE”就会被加密成完全相同的三个密文字母。什么时候密钥片段会相同当位置m和n之间的距离(n - m)正好是密钥长度的整数倍时因为密钥是循环使用的每过一个密钥长度密钥序列就重复一次。因此卡西斯基试验的核心思想是在密文中寻找重复出现的、长度至少为3的字母序列计算它们起始位置之间的距离这些距离的最大公约数就很有可能是密钥的长度。3.2 实战演练一步步找出密钥长度假设我们截获了以下密文为了演示我们已知密钥为CIPHER但作为攻击者我们不知道VPXZGIAXIVWPUBTTMJPWIZITWZT寻找重复序列仔细扫描密文寻找长度3的重复字符串。我们发现“VWP”出现了两次。第一次起始于位置1V是第1个字母。第二次起始于位置13V是第13个字母。我们还发现“TWI”出现了两次。第一次起始于位置11。第二次起始于位置23。在实际长密文中可能会有更多重复序列提高判断准确性。计算间隔对于“VWP”间隔 13 - 1 12对于“TWI”间隔 23 - 11 12求最大公约数GCD我们得到的间隔集合是 {12, 12}。它们的最大公约数是 12。推测密钥长度最大公约数12很可能就是密钥长度。但也可能是12的因数比如2, 3, 4, 6。因为如果真正的密钥长度是6那么间隔126的2倍也会导致重复。所以我们需要用其他方法如下文的重合指数法来验证。3.3 技巧与注意事项序列长度通常寻找长度为3或4的重复序列。太短的序列如2个字母可能由巧合产生噪音太大太长的序列在密文中又过于罕见。误差处理得到的GCD可能不止一个候选。例如间隔可能是 {30, 36, 42}它们的GCD是6但2和3也是公约数。此时密钥长度可能是6也可能是3或2。需要结合其他信息判断。自动化工具对于长密文手动寻找重复序列非常耗时。可以用编程快速实现滑动一个3-4字母的窗口遍历密文用哈希表记录每个序列出现的位置最后筛选出出现次数大于1的序列并计算间隔。并非万能如果明文本身没有足够多的重复模式或者密钥长度很长密文中可能找不到明显的重复序列卡西斯基试验就会失效。这时就需要依赖下文的重合指数法进行“盲猜”。实操心得卡西斯基试验成功的关键在于密文量要足够大。通常密文长度至少应是密钥长度的20-30倍以上明文本身也应是自然语言富含“THE”“AND”“ING”等重复片段这样试验结果才可靠。在CTF夺旗赛或解谜题中出题人往往会确保这一点。如果试验后得到的候选长度很多且没有明显的主峰就要警惕密钥可能很长或者明文特殊性太高。4. 攻击策略二重合指数法——验证长度与统计学武器卡西斯基试验给了我们一个密钥长度的候选值但我们需要更可靠的证据。同时当卡西斯基试验失效时我们还需要一种方法能直接推测密钥长度。重合指数Index of Coincidence, IC就是这件强大的统计学武器。4.1 重合指数是什么重合指数衡量的是一段文本中随机抽取两个字母它们相同的概率。对于一段完全随机的英文文本26个字母均匀分布这个概率大约是1/26 ≈ 0.0385。但对于一段正常的英文文章由于字母频率不均E最多Z最少这个概率会高得多大约在0.065左右。这个特性有什么用呢对于维吉尼亚密文如果我们能把它“还原”成几组单表替换的密文那么每一组的IC值就应该接近0.065。而还原的方法就是按猜测的密钥长度进行分桶。4.2 用重合指数法确定密钥长度假设我们猜测密钥长度是L。创建L个“桶”将密文字母按位置放入不同的桶中。桶1包含第1 第1L 第12L ... 个字母。桶2包含第2 第2L 第22L ... 个字母。...桶L包含第L 第2L 第3L ... 个字母。 这样做的逻辑是如果L猜对了那么每个桶里的所有字母都是用同一个密钥字母加密的也就是说每个桶本质上是一个凯撒密码单表替换的密文。计算每个桶的IC值对每个桶内的文本计算其重合指数。计算公式IC (Σ (n_i * (n_i - 1))) / (N * (N - 1))其中n_i是字母i在桶中出现的次数N是桶中字母总数。例如一个桶里有100个字母字母A出现12次B出现5次... 那么Σ (n_i * (n_i - 1))就是12*11 5*4 ...的总和。计算平均IC值将L个桶的IC值求平均。判断如果猜测的L是正确的密钥长度那么每个桶都是单表替换密文其IC值应接近英文文本的期望值0.065因此平均IC值会显著高于随机文本的0.0385并接近0.065。如果猜测的L是错误的那么每个桶里的字母是由多个不同密钥字母加密的混合体其统计特性更接近随机分布平均IC值会接近0.0385。遍历测试我们可以让L从1开始递增比如1到20分别计算每个L对应的平均IC值。那个使得平均IC值出现峰值的L就是最可能的密钥长度。4.3 实战计算示例假设我们有一段密文我们分别测试L3,L4,L5,L6其中L6是正确长度。猜测的密钥长度 (L)桶1 IC值桶2 IC值桶3 IC值桶4 IC值桶5 IC值桶6 IC值平均IC值30.0410.0390.043---0.04140.0400.0420.0380.041--0.04050.0390.0440.0400.0380.042-0.04160.0680.0640.0710.0620.0660.0690.067从上表可以清晰看出当L6时每个桶的IC值都跃升到了0.06以上平均IC值0.067非常接近英文的0.065。而其他长度的平均IC值都在0.04左右徘徊接近随机值。这强有力地证实了密钥长度为6。实操心得重合指数法非常稳健是破解维吉尼亚密码的“基石”。在编程实现时要注意处理桶大小不一的情况最后一个桶可能字母较少。对于短密文IC值波动可能较大此时需要结合卡西斯基试验的结果综合判断。一个常见的技巧是不仅看平均IC值也观察每个桶的IC值是否都较高这能进一步增加确信度。5. 攻击策略三频率分析——破解每一个密钥字母一旦我们通过卡西斯基试验或重合指数法确定了密钥长度L战役就胜利了一大半。接下来问题从“破解一个多表密码”简化为“破解L个独立的凯撒密码”。而对付凯撒密码我们有利器——频率分析。5.1 分而治之将问题分解假设L6。我们把密文分成6个桶或称为6个子序列子序列1: 第1, 7, 13, 19...个字母子序列2: 第2, 8, 14, 20...个字母...子序列6: 第6, 12, 18, 24...个字母现在每个子序列都是用同一个密钥字母加密的凯撒密码密文。我们的任务就是为每个子序列找出那个偏移量即密钥字母。5.2 针对单表替换的频率攻击对于英文文本字母的出现频率有稳定的分布。例如E的出现频率最高约12.7%其次是T, A, O, I, N, S, H, R等。对于一个用凯撒密码加密的文本字母的频率分布整体平移了但分布的形状保持不变。攻击步骤如下对每一个子序列独立进行统计频率计算该子序列中每个字母A-Z出现的次数和频率。计算拟合优度尝试所有26种可能的偏移量即假设密钥字母是A到Z。对于每一种假设的偏移量k我们将密文字母反向偏移k位即解密操作得到一个“候选明文”序列。比较频率分布计算这个“候选明文”序列的字母频率分布与标准的英文字母频率分布进行比较。常用的比较方法是计算卡方统计量或互相关。卡方值越小说明候选分布与标准分布越相似。卡方统计量公式χ² Σ ( (观测值 - 期望值)² / 期望值 )对26个字母求和。期望值 标准频率 * 子序列总字母数。选择最佳偏移那个使得卡方统计量最小或互相关最大的偏移量k就是最有可能的密钥字母偏移量。k0对应密钥字母Ak1对应B...k25对应Z。5.3 实战演示破解第一个密钥字母假设我们对子序列1进行统计得到前5个高频字母是H(15%),D(11%),L(10%),P(9%),X(8%)。标准英文前5高频字母是E(12.7%),T(9.1%),A(8.2%),O(7.5%),I(7.0%)。我们需要找一个偏移量k使得H, D, L, P, X分别对应E, T, A, O, I。这看起来像是一个拼图。如果假设H是E加密而来那么偏移量k H(7) - E(4) 3。用这个偏移量去试D(3) - 3 A(0)L(11) - 3 I(8)P(15) - 3 M(12)X(23) - 3 U(20)。得到的候选明文高频字母是E, A, I, M, U这与标准频率E, T, A, O, I匹配度一般只有E和A匹配上了。我们尝试计算所有26个偏移量的卡方值。通过程序计算后发现当偏移量k15时卡方值最小。这意味着将子序列1的每个字母向后移动15位或向前移动11位解密后得到的文本字母频率最像英文。k15对应的密钥字母是P因为A0 P15。重复这个过程对6个子序列分别进行频率分析我们就能得到6个密钥字母从而拼出完整的密钥。5.4 处理噪声与优化策略频率分析并非总是直截了当尤其是当子序列较短时统计特征不明显。使用双字母频率除了单字母频率还可以分析双字母组合如TH, HE, IN, ER, AN等的频率。当单字母分析出现多个候选时用双字母频率可以进一步筛选。例如解密后的文本如果出现大量“QX”、“ZJ”这种英文中极罕见的组合那这个偏移量很可能就是错的。交互式调整自动分析给出最可能的密钥后得到的明文可能仍有部分单词看起来是乱码。这是因为某个子序列的密钥字母猜错了。此时可以手动微调那个可疑的密钥字母比如在最佳候选的相邻字母中尝试观察解密出的明文是否变得更“通顺”。人类的语言识别能力在这里是强大的后盾。考虑语言模型更高级的方法是将解密过程视为一个优化问题使用字典或n-gram语言模型评分搜索使解密文本“最像英文”的密钥。实操心得频率分析这一步最考验耐心和细致。自动化脚本可以给出最佳候选但永远要人工复审解密出的明文。一个非常有效的技巧是将整个密钥初步推测出来后用这个密钥去解密整个密文。然后不是从头阅读而是只看解密文本的第1 第1L 第12L...位置即第一个子序列对应的明文。如果这些位置组成的单词或片段看起来合理说明第一个密钥字母很可能对了。依次检查每个子序列对应的明文片段能快速定位哪个密钥字母可能出了问题。6. 攻击策略四暴力破解与已知明文攻击当前三种基于统计的分析方法都遇到困难时例如密文极短或者密钥长度很长且明文特殊我们还有最后的手段——暴力破解。此外如果攻击者拥有部分“已知明文”攻击难度将急剧下降。6.1 暴力破解的可行性边界暴力破解即尝试所有可能的密钥。密钥空间有多大这取决于密钥长度L和密钥字母的取值范围。如果密钥是标准的英文单词来自某个字典假设字典有D个单词那么尝试次数就是D。对于现代计算机如果D在十万量级暴力枚举是可行的。如果密钥是随机的字母序列长度为L那么密钥空间是26^L。L3:26^3 17,576种可能 —— 瞬间可破。L5:26^5 ≈ 1180万—— 现代计算机可在秒级完成。L10:26^10 ≈ 1.4e14—— 这个规模对于个人计算机就非常耗时了但对于拥有强大算力的机构仍可能通过分布式计算在可接受时间内完成。L15及以上26^15 ≈ 1.6e21这在实际中可视为计算上不可行。因此确保密钥足够长如12个随机字符以上是抵御暴力破解的根本。但请注意长密钥又回到了密钥分发和记忆的古典难题。6.2 已知明文攻击最脆弱的一环已知明文攻击是指攻击者不仅拥有密文还知道一部分对应的明文。在历史战场上这可能源于固定的报文格式如“尊敬的指挥官”、“天气晴朗”在现代场景中可能源于文件头、协议格式或常见用语。假设我们知道密文前10个字母对应的明文是“ATTACKATDA”。那么根据解密公式K_i (C_i - P_i) mod 26我们可以直接计算出前10个密钥字母密文前10位:LXOPVEFRNH已知明文:ATTACKATDA计算密钥L(11) - A(0) 11 - LX(23) - T(19) 4 - EF(5) - T(19) -14 mod 26 12 - MO(14) - A(0) 14 - OP(15) - C(2) 13 - NV(21) - K(10) 11 - LE(4) - A(0) 4 - EF(5) - T(19) -14 mod 26 12 - MR(17) - D(3) 14 - OH(7) - A(0) 7 - H我们得到了密钥片段LEMONLEMOH。这立刻暴露了密钥是重复的LEMON第10位H可能是计算误差或明文/密文传输错误但前9位已经清晰显示了周期为5的LEMON。一旦知道了密钥甚至只是其周期整个密文就告破了。注意已知明文攻击对几乎所有古典密码都是致命的。这强调了在现代密码学中一个安全的密码系统必须能够抵抗“已知明文攻击”甚至更强的“选择明文攻击”而维吉尼亚密码显然不具备这种性质。6.3 针对短密文的策略融合当密文非常短比如只有密钥长度的2-3倍时卡西斯基试验和重合指数法都会因为数据量不足而失效。此时攻击策略需要调整假设密钥长度范围根据经验或上下文假设一个较小的密钥长度范围如1到10。对每个可能的长度L进行暴力搜索对于每个L密钥有26^L种可能。当L很小时如1-5这个空间是可搜索的。使用语言模型进行筛选对于每一个尝试的密钥用它解密整个密文得到一个候选明文。然后用一个简单的语言模型比如计算解密文本中常见英文单词的出现次数或计算字母n-gram的概率给这个候选明文打分。输出最佳候选选择得分最高的几个密钥和对应的明文供人工最终判断。由于密文短正确的解密结果应该能形成有意义的单词或句子很容易被识别出来。实操心得在CTF或解谜中遇到非常短的维吉尼亚密文往往意味着密钥也很短1-3位或者出题人期望你使用已知明文攻击比如flag格式是flag{...}。首先尝试假设密钥长度并优先用已知的明文片段如果有可能去试探能节省大量时间。永远不要低估“猜”的力量——结合上下文猜测可能的明文单词如“the”“of”“and”“flag”往往是打开局面的钥匙。7. 从维吉尼亚到现代古典密码的教训与启示手动走完一遍维吉尼亚密码的加密与四种攻击策略我们收获的远不止如何破解一个具体的密码。它更像一个完美的教学案例揭示了密码学设计中最核心的一些原则和陷阱。首先它展示了“混淆”与“扩散”的早期实践。维吉尼亚通过多表替换实现了良好的“混淆”将明文符号的统计特性隐藏起来但它缺乏“扩散”一个明文符号的变化应该影响多个密文符号。其密钥的周期性重复是致命的弱点卡西斯基试验正是利用了这一点。现代分组密码如AES则通过多轮复杂的替代和置换操作同时实现了高度的混淆和扩散。其次它明确了“密钥空间”与“计算安全”的概念。维吉尼亚的密钥空间相对于凯撒是巨大的增长但在现代计算能力面前短密钥依然不堪一击。这引出了现代密码学的一个基石密码系统的安全性应依赖于密钥的保密而非算法的保密柯克霍夫原则。维吉尼亚算法完全公开安全只系于密钥一身。再者它凸显了“已知明文攻击”的威胁。任何不能抵抗已知明文攻击的密码系统在实际中都是脆弱的。现代加密标准如AES在设计之初就必须满足能抵抗已知明文甚至选择明文攻击。最后攻击过程本身是一次完整的安全分析演练。从观察卡西斯基、统计重合指数、模式匹配频率分析到穷举暴力破解这套方法论至今仍在密码分析中通用只是面对的数学对象从字母表变成了比特串和复杂的代数结构。在我个人学习密码学的过程中亲手用Python实现一遍维吉尼亚的加密解密再写脚本实现卡西斯基试验和重合指数法攻击是理解这些抽象概念最有效的方式。你会遇到各种边界情况比如如何处理非字母字符如何计算负数的模当密文长度不是密钥整数倍时最后一个分组如何处理。解决这些细节问题的过程比单纯理解原理要深刻得多。所以如果你对信息安全感兴趣不妨就以维吉尼亚密码为起点动手实现它然后再尝试破解它。当你成功从一段无意义的密文中恢复出“ATTACKATDAWN”时那种解谜的成就感以及背后对密码学核心逻辑的领悟将是任何教科书都无法给予的。这不仅是学习一段历史更是理解当今数字世界安全基石的第一步。
返回列表