弗纳姆密码示例与教程
通过实际示例学习如何使用一次性密码本加密
1. 基础加密示例
2. 分步教程(维吉尼亚模式)
第一步:将字母转换为数字
每个字母被分配一个 0-25 的数字(A=0,B=1,……,Z=25)
第二步:相加对应数值
将明文和密钥值相加,然后取模 26 以保持在字母范围内
第三步:得出结果
加密后的消息在没有密钥的情况下在数学上无法破解
3. XOR 模式示例
理解 XOR 运算
XOR(异或)是一种二进制运算,仅当两个输入不同时输出为 1。
二进制示例
4. 历史案例:冷战 OTP
冷战期间,苏联特工和外交官广泛使用一次性密码本进行安全通信。这些密码本是小册子,包含随机数字或字母页面。每页只用于一条消息,之后立即销毁。
维诺纳项目: 二战期间苏联特工重复使用密钥时,美国密码分析人员得以解密数千条消息,致使多个间谍网络暴露。这充分说明了密钥重用的灾难性后果。
5. 常见错误须知
❌ 错误一:重复使用密钥
如果您对两条不同的消息使用同一密钥,攻击者可以对密文进行 XOR 运算,消除密钥,从而揭示两段明文的信息。
示例:维诺纳项目通过利用重复使用的密钥破解了苏联通信。
❌ 错误二:使用非随机密钥
使用字典单词或规律作为密钥,会使密码容易受到字典攻击和统计分析的威胁。
始终使用密码学安全的随机数生成器。
❌ 错误三:密钥短于消息
如果密钥短于消息并重复,它就变成了易受密码分析攻击的维吉尼亚密码。
密钥长度必须等于或超过消息长度,才能保证完美保密性。
通过实践示例,弗纳姆密码(一次性密码本)的学习变得清晰直观。本页面提供全面的弗纳姆密码示例演示,从基础加密到高级历史案例研究。每个一次性密码本示例都包含详细的逐步计算,帮助你理解这种理论上不可破解的密码背后的数学和安全原则。无论你是密码学学生、历史爱好者,还是仅仅对完美保密性感到好奇,这些教程材料都将引导你从初学者成长为自信的实践者。
我们的示例从简单演示系统地递进到复杂的真实场景。你将看到基础的弗纳姆密码加密和解密、涵盖每个计算步骤的完整教程、XOR 模式演示、来自冷战时代的历史案例研究,以及关于危害安全性的常见错误的关键教训。每个一次性密码本示例都可以直接加载到我们的在线工具中,让你能够验证计算并尝试变体。
示例1——基础弗纳姆密码加密(维吉尼亚模式)
场景
让我们从最简单的弗纳姆密码示例开始,理解基本加密过程。我们将使用随机密钥"XMCKL"在维吉尼亚模式下加密消息"HELLO"。这个基础示例演示了字母到数字的转换、模加法和加密算法的最直接形式。虽然真实的一次性密码本应用使用更长的密钥和消息,但这个紧凑的示例让每个计算步骤都易于跟踪。
逐步加密过程
第1步:将字母转换为数字
弗纳姆密码加密的第一步是将字母转换为对应的数值。我们使用标准映射:A=0, B=1, C=2,延续到Z=25。这为我们提供了对字母执行数学运算的一致方法。
- 明文 HELLO 转换为:H=7, E=4, L=11, L=11, O=14
- 密钥 XMCKL 转换为:X=23, M=12, C=2, K=10, L=11
第2步:相加对应的值
现在我们将每个明文数字与其对应的密钥数字相加。这是实际加密发生的地方:
- H + X = 7 + 23 = 30
- E + M = 4 + 12 = 16
- L + C = 11 + 2 = 13
- L + K = 11 + 10 = 21
- O + L = 14 + 11 = 25
注意第一个计算(7 + 23 = 30)产生了大于25的数字。这就是下一步模运算变得必要的地方。
第3步:应用模26
为了将结果保持在26字母字母表范围内,我们对每个总和应用模26。这将任何大于25的数字包回0-25范围:
- 30 mod 26 = 4 = E
- 16 mod 26 = 16 = Q
- 13 mod 26 = 13 = N
- 21 mod 26 = 21 = V
- 25 mod 26 = 25 = Z
最终密文是 EQNVZ。这个示例展示了明文"HELLO"如何完全转换为密文,当密钥是真随机时不会泄露关于原始消息的任何信息。
第4步:验证
要验证加密,我们可以逆转过程。解密时减去密钥值:E(4) - X(23) = -19 mod 26 = 7 = H,依此类推,返回"HELLO"。这演示了一次性密码本的数学对称性。
亲自尝试
将此示例直接加载到我们的弗纳姆密码编码器中,观看加密过程。尝试修改消息或密钥,观察变化如何影响密文。
示例2——包含加密和解密的完整教程
消息
对于这个综合教程,我们将加密一个更长、更实际的消息:"ATTACKATDAWN"(著名的军事命令)。首先,我们删除空格并将所有内容转换为大写,得到12个字符进行加密。此示例演示从明文到密文再到明文的完整工作流程,展示弗纳姆密码加密和解密的两个阶段。
生成随机密钥
任何弗纳姆密码示例的关键部分是密钥生成。对于"ATTACKATDAWN"(12个字母),我们需要至少12个字母的密钥。让我们使用随机密钥:"XJHREOWKGFLM"。在真实的一次性密码本应用中,此密钥将使用密码学安全的随机数生成器生成,而非手动选择。密钥的随机性提供了完美保密性的数学保证。
加密过程
让我们逐步用密钥"XJHREOWKGFLM"加密"ATTACKATDAWN":
| 明文 | P值 | 密钥 | K值 | 总和 | Mod 26 | 密文 |
|---|---|---|---|---|---|---|
| A | 0 | X | 23 | 23 | 23 | X |
| T | 19 | J | 9 | 28 | 2 | C |
| T | 19 | H | 7 | 26 | 0 | A |
| A | 0 | R | 17 | 17 | 17 | R |
| C | 2 | E | 4 | 6 | 6 | G |
| K | 10 | O | 14 | 24 | 24 | Y |
| A | 0 | W | 22 | 22 | 22 | W |
| T | 19 | K | 10 | 29 | 3 | D |
| D | 3 | G | 6 | 9 | 9 | J |
| A | 0 | F | 5 | 5 | 5 | F |
| W | 22 | L | 11 | 33 | 7 | H |
| N | 13 | M | 12 | 25 | 25 | Z |
加密后的密文是 XCARGYWDJFHZ。此示例展示了有意义的消息如何转变为看似随机的字母。没有密钥"XJHREOWKGFLM",数学上不可能确定此密文解密为"ATTACKATDAWN"。
解密过程
现在让我们使用相同密钥"XJHREOWKGFLM"将"XCARGYWDJFHZ"解密回原始消息。解密过程使用带模26的减法:
| 密文 | C值 | 密钥 | K值 | C - K | Mod 26 | 明文 |
|---|---|---|---|---|---|---|
| X | 23 | X | 23 | 0 | 0 | A |
| C | 2 | J | 9 | -7 | 19 | T |
| A | 0 | H | 7 | -7 | 19 | T |
| R | 17 | R | 17 | 0 | 0 | A |
| G | 6 | E | 4 | 2 | 2 | C |
| Y | 24 | O | 14 | 10 | 10 | K |
| W | 22 | W | 22 | 0 | 0 | A |
| D | 3 | K | 10 | -7 | 19 | T |
| J | 9 | G | 6 | 3 | 3 | D |
| F | 5 | F | 5 | 0 | 0 | A |
| H | 7 | L | 11 | -4 | 22 | W |
| Z | 25 | M | 12 | 13 | 13 | N |
解密后的明文是 ATTACKATDAWN ——完美验证!注意"C - K"列中的负值如何通过模26正确处理以产生正确的明文字母。
关键要点
此完整教程演示了几个关键点:加密和解密是精确的数学逆运算;密钥长度必须等于或大于消息长度;模运算正确处理0-25范围之外的值;密文看起来完全随机且不揭示任何关于明文的信息。你可以在我们的编码器和解码器页面上练习此示例。
示例3——XOR 模式加密
理解 XOR 运算
在深入了解基于 XOR 的示例之前,让我们先了解 XOR(异或)运算。XOR 是一种二进制运算,当两个输入位不同时返回1,相同时返回0。XOR 真值表:
- 0 XOR 0 = 0(相同位 = 0)
- 0 XOR 1 = 1(不同位 = 1)
- 1 XOR 0 = 1(不同位 = 1)
- 1 XOR 1 = 0(相同位 = 0)
XOR 加密的美妙特性是其对称性:用相同密钥两次应用 XOR 会返回原始值。这使得 XOR 非常适合一次性密码本演示,因为加密和解密使用完全相同的操作。这就是为什么许多现代弗纳姆密码实现使用 XOR 模式。
二进制加密示例
让我们使用 XOR 加密字母'H'。首先,使用 ASCII 将'H'转换为二进制:H = 72(十进制)= 01001000(二进制)。
接下来,我们需要一个随机密钥字节:10110111
现在我们逐位执行 XOR 运算:
明文: 01001000 (H)
密钥: 10110111 (随机)
-------- XOR 运算
密文: 11111111 (255,十进制)
加密结果是二进制值11111111。要验证 XOR 加密是否正确,我们用相同密钥再次应用 XOR 进行解密:
密文: 11111111
密钥: 10110111 (相同密钥)
-------- XOR 运算
明文: 01001000 (H 恢复!)
此示例展示了 XOR 的自逆特性——相同操作既能加密又能解密。
完整单词示例
让我们在 XOR 模式下加密完整单词"HELLO"。每个字母转换为8位:
H = 01001000 → XOR 密钥字节 10110111 = 11111111
E = 01000101 → XOR 密钥字节 00101101 = 01101000
L = 01001100 → XOR 密钥字节 11110001 = 10111101
L = 01001100 → XOR 密钥字节 01011110 = 00010010
O = 01001111 → XOR 密钥字节 10001100 = 11000011
结果密文字节(二进制)为:11111111 01101000 10111101 00010010 11000011
示例4——历史案例研究:冷战一次性密码本
苏联间谍通信
最引人入胜的一次性密码本案例之一来自冷战间谍活动。苏联情报机构,尤其是克格勃,大量依靠一次性密码本系统与在外国的特工通信。苏联特工携带含有随机数字页面的小册子——实物一次性密码本。每页为加密单条消息提供密钥材料,使用后特工会撕下并销毁该页。
这个历史案例展示了完美保密性在真实间谍活动中的实际实现。在莫斯科接受指令的特工会使用其OTP小册子中的适当页面解密消息。莫斯科总部保存了相同的小册子,确保发送方和接收方拥有匹配的密钥。该系统为苏联情报通信提供了绝对安全——被美国或英国情报截获的消息在没有实物一次性密码本小册子的情况下完全无法读取。
文字密码项目——OTP"被破解"的故事
文字密码项目(Venona Project)代表了"破解"一次性密码本最著名的案例——但理解这并非弗纳姆密码方法中的缺陷至关重要。二战期间,由于战时压力,苏联面临严重的密钥材料短缺。他们没有因停止通信而危及行动安全,而是做出了一个致命决定:重复使用了一些一次性密码本密钥。这种密钥重用将他们理论上不可破解的密码变成了脆弱的系统。
美国和英国密码分析师在1940年代末发现了这种密钥重用。当同一密钥加密两条不同消息时,分析师可以对两个密文进行 XOR,从方程中消除密钥,揭示两个明文的 XOR。这一数学特性使密码分析师能够使用统计分析、语言模式和已知明文片段(密文拖拉)来解密部分苏联情报消息。几十年来,文字密码项目解密了约3000条消息,暴露了美国和英国的众多苏联间谍网络。
这个历史案例教导了一个关键教训:弗纳姆密码在密码学意义上并未被"破解"。加密算法保持完好。失败的是人类对密钥管理规则的遵守。文字密码项目之所以成功,不是因为一次性密码本弱,而是因为不当使用破坏了其安全属性。当正确使用时——就像许多至今仍未解密的其他苏联通信一样——一次性密码本完美地保守了秘密。
示例5——常见错误及其危险性
错误1——重用密钥
让我们用具体例子演示密钥重用为何是灾难性的。假设我们用相同密钥加密两条消息:
消息1: "HELLO" + 密钥: "XMCKL" = 密文1: "EQNVZ"
消息2: "WORLD" + 密钥: "XMCKL" = 密文2: "TYEPP"
这违反了一次性密码本安全的基本规则。截获两个密文的攻击者可以对它们进行 XOR:
EQNVZ XOR TYEPP = (结果包含 HELLO 和 WORLD 的 XOR)
XOR 运算消除了密钥,只留下两个明文的 XOR。使用频率分析、常见单词模式和统计方法,熟练的密码分析师可以在不确定密钥的情况下恢复两个原始消息。这正是文字密码项目成功的方式。
此案例的教训是绝对的:永远不要重用密钥。每条消息都需要自己独特的随机密钥。即使重用密钥的单个字符也会危及两条消息中那些位置的安全。这就是为什么该系统被称为"一次性"密码本——密钥确实只能一次性使用。
错误2——使用非随机密钥
另一个危险错误是使用非随机密钥。假设有人使用单词"SECRET"作为密钥:
消息: "ATTACK"
密钥: "SECRET"
结果: "SSGVIV"
乍一看,这似乎有效——我们得到了密文。但这个密钥不是随机的;它是一个有模式和偏差的字典单词。"SECRET"中的字母频率分布与完美保密性所需的均匀分布不匹配。攻击者可以利用这种非随机性。
此外,如果攻击者猜测或发现正在使用字典单词作为密钥,他们可以尝试常见单词作为潜在密钥。密钥空间从26^6个随机组合缩减到数量少得多的6个字母的英文单词。这种脆弱性将你的弗纳姆密码加密变成更像维吉尼亚密码的东西——可通过频率分析和字典攻击破解。
真正的一次性密码本安全性需要密码学安全的随机数生成。使用我们的密钥生成器,该工具采用浏览器的加密 API 确保真正的随机性。永远不要使用密码、字典单词、名字、日期或任何有规律的序列作为密钥。
错误3——使用短密钥
第三个关键错误是使用比消息短的密钥。假设我们有:
消息: "ATTACKATDAWN" (12个字母)
密钥: "SECRET" (6个字母——太短了!)
当密钥用完时,你有两个糟糕的选择:要么将消息截断为6个字母(丢失信息),要么重复密钥。大多数人会重复密钥:
消息: "ATTACKATDAWN"
密钥: "SECRETSECRET" (重复)
这将你的一次性密码本转变为重复密钥密码,本质上是一个6字母关键词的维吉尼亚密码。安全性完全丧失。密码分析师可以使用 Kasiski 检验识别密钥长度,然后使用频率分析独立解决每个位置。
密钥长度要求在任何适当的教程中都是绝对的:密钥的长度必须至少与消息一样长。如果你需要加密1000个字符的消息,就生成一个1000字符的密钥。没有任何捷径能维持安全性。
练习题
用这些练习测试你的理解。先在纸上尝试解决,然后使用我们的在线工具验证答案。
练习1:简单加密
问题:在维吉尼亚模式下使用密钥"DOG"加密消息"CAT"。
提示:将字母转换为数字(C=2, A=0, T=19 和 D=3, O=14, G=6),用模26相加,然后转换回来。
显示答案
C (2) + D (3) = 5 mod 26 = 5 = F
A (0) + O (14) = 14 mod 26 = 14 = O
T (19) + G (6) = 25 mod 26 = 25 = Z
答案: "FOZ"
练习2:解密练习
问题:在维吉尼亚模式下使用密钥"XMCKL"解密密文"EQNVZ"。
提示:这是加密的逆过程——从密文值中减去密钥值,用模26处理。
显示答案
E (4) - X (23) = -19 mod 26 = 7 = H
Q (16) - M (12) = 4 mod 26 = 4 = E
N (13) - C (2) = 11 mod 26 = 11 = L
V (21) - K (10) = 11 mod 26 = 11 = L
Z (25) - L (11) = 14 mod 26 = 14 = O
答案: "HELLO"
练习3:XOR 模式挑战
问题:使用 XOR 加密二进制字节00110011与密钥字节11001100。
提示:逐位应用 XOR:0 XOR 1 = 1, 1 XOR 1 = 0,等等。
显示答案
明文: 00110011
密钥: 11001100
-------- XOR
密文: 11111111
验证,再次 XOR:
11111111 XOR 11001100 = 00110011 ✓
常见问题
如何计算弗纳姆密码?
要计算弗纳姆密码,请遵循以下系统流程:首先,使用A=0, B=1直到Z=25将明文和密钥都转换为数字。其次,将每个明文数字与其对应的密钥数字相加。第三,对每个结果应用模26,将值保持在0-25范围内。最后,将结果数字转换回字母作为密文。例如:H(7) + X(23) = 30 mod 26 = 4 = E。
这展示了维吉尼亚模式的过程。对于 XOR 模式,将字母转换为二进制,并逐位应用 XOR 而非加法。通过上面的示例练习,特别是示例1(基础加密)和示例2(完整加密和解密)。
能展示一个一次性密码本密码示例吗?
当然可以!上面的示例1演示了一个基础示例:用密钥"XMCKL"加密"HELLO"产生密文"EQNVZ"。更全面的示例请参阅示例2,它展示了"ATTACKATDAWN"的完整加密过程,包含详细的逐步计算和显示每个数学运算的表格。该示例还包括解密过程,展示如何从密文恢复原始消息。
如何解决一次性密码本密码?
要解密一次性密码本密码,你绝对必须拥有原始加密密钥——由于完美保密性,没有密钥就无法"解决"它。如果你有密钥,流程很简单:将密文和密钥转换为数字,从密文值中减去密钥值,应用模26正确处理负数,然后转换回字母。
参阅示例2的解密部分,查看详细展示此过程的一次性密码本示例:X(23) - X(23) = 0 = A, C(2) - J(9) = -7 mod 26 = 19 = T,依此类推,从密文恢复"ATTACKATDAWN"。记住:没有密钥,正确实现的一次性密码本在数学上是不可能解密的,而不仅仅是困难。
如果重用一次性密码本密钥会发生什么?
重用一次性密码本密钥完全破坏了密码的安全性,如示例5错误1所示。当同一密钥加密两条消息时,攻击者可以对两个密文进行 XOR,消除密钥并揭示两个明文的 XOR。这使得强大的密码分析成为可能,可以在不知道密钥的情况下恢复两个原始消息。著名的文字密码项目(在示例4中详述)之所以成功解密苏联情报消息,正是因为二战期间密钥被重用。
这是任何弗纳姆密码示例中最关键的错误——永远不要重用密钥。一次性密码本的完美保密性绝对依赖于单次使用的密钥。用密钥加密后,该密钥必须被安全销毁,永远不能用于任何其他消息。
准备好亲自尝试了吗?
现在你已经完成了这些全面的弗纳姆密码示例和一次性密码本教程,可以使用实际加密工具进行实验了。本页上的所有示例都可以使用我们的在线弗纳姆密码计算器和解码器重现和修改。
开始加密 — 访问我们的弗纳姆密码编码器加密你自己的消息。尝试重现示例1或示例2以验证你的理解,然后用你自己的消息和密钥进行实验。
尝试解密 — 在我们的弗纳姆密码解码器页面练习解密。使用上面任意示例的密文及其对应密钥,观看解密过程。
生成密钥 — 使用我们的一次性密码本密钥生成器创建真正随机、密码学安全的密钥。记住示例5中关于密钥质量的教训——始终使用适当的随机密钥,永远不要使用字典单词或有规律的模式。
弗纳姆密码加密和解密过程通过实践变得直观。这些一次性密码本示例提供了基础;使用工具进行动手实验巩固你的理解。探索、实验,了解为什么 Gilbert Vernam 的发明至今仍是密码学史上唯一被证明不可破解的密码。