格朗斯费尔德密码示例与教程
本综合指南提供了格朗斯费尔德密码加密与解密的分步示例。无论您是在备战 CTF 竞赛、学习古典密码学,还是仅仅对历史加密方法感到好奇,这些示例都将帮助您掌握格朗斯费尔德密码。
基础加密示例
示例 1:使用密钥 "314" 加密简单消息
明文: HELLO 密钥: 314
逐步加密过程:
| 字母 | 位置 | 密钥数字 | 计算 | 结果 |
|---|---|---|---|---|
| H | 7 | 3 | (7+3) mod 26 = 10 | K |
| E | 4 | 1 | (4+1) mod 26 = 5 | F |
| L | 11 | 4 | (11+4) mod 26 = 15 | P |
| L | 11 | 3 | (11+3) mod 26 = 14 | O |
| O | 14 | 1 | (14+1) mod 26 = 15 | P |
密文: KFPOP
注意密钥 "314" 在加密每个字母时如何循环重复(3、1、4、3、1、……)。
示例 2:使用密钥 "2718" 加密较长消息
明文: ATTACK AT DAWN 密钥: 2718
| 字母 | 位置 | 密钥 | 计算 | 结果 |
|---|---|---|---|---|
| A | 0 | 2 | (0+2) mod 26 = 2 | C |
| T | 19 | 7 | (19+7) mod 26 = 0 | A |
| T | 19 | 1 | (19+1) mod 26 = 20 | U |
| A | 0 | 8 | (0+8) mod 26 = 8 | I |
| C | 2 | 2 | (2+2) mod 26 = 4 | E |
| K | 10 | 7 | (10+7) mod 26 = 17 | R |
| (空格) | - | - | 保持不变 | (空格) |
| A | 0 | 1 | (0+1) mod 26 = 1 | B |
| T | 19 | 8 | (19+8) mod 26 = 1 | B |
| (空格) | - | - | 保持不变 | (空格) |
| D | 3 | 2 | (3+2) mod 26 = 5 | F |
| A | 0 | 7 | (0+7) mod 26 = 7 | H |
| W | 22 | 1 | (22+1) mod 26 = 23 | X |
| N | 13 | 8 | (13+8) mod 26 = 21 | V |
密文: CAUIER BB FHXV
解密示例
示例 3:已知密钥解密
密文: KFPOP 密钥: 314
解密过程(逆转加密步骤):
| 字母 | 位置 | 密钥 | 计算 | 结果 |
|---|---|---|---|---|
| K | 10 | 3 | (10-3+26) mod 26 = 7 | H |
| F | 5 | 1 | (5-1+26) mod 26 = 4 | E |
| P | 15 | 4 | (15-4+26) mod 26 = 11 | L |
| O | 14 | 3 | (14-3+26) mod 26 = 11 | L |
| P | 15 | 1 | (15-1+26) mod 26 = 14 | O |
明文: HELLO
示例 4:处理环绕情况
当解密结果出现负数时,在取模之前先加 26:
密文: BCD 密钥: 543
| 字母 | 位置 | 密钥 | 计算 | 结果 |
|---|---|---|---|---|
| B | 1 | 5 | (1-5+26) mod 26 = 22 | W |
| C | 2 | 4 | (2-4+26) mod 26 = 24 | Y |
| D | 3 | 3 | (3-3+26) mod 26 = 0 | A |
明文: WYA
练习挑战
在查看答案之前,请尝试自行解密以下消息:
挑战 1:简单
密文: LIPPS 密钥: 314 提示: 一句常见的问候语
挑战 2:中等
密文: WKUHH EOLQG PLFH 密钥: 314 提示: 一首童谣的引用
挑战 3:高级
密文: GSRH RH Z HVXIVG NVHHZTV 密钥: 未知(尝试暴力破解!) 提示: 密钥是单个重复的数字
历史背景
为什么选择数字密钥?
格朗斯费尔德伯爵在 17 世纪为军事野战使用设计了这种密码。数字密钥具有几个实际优势:
- 易记性:日期或部队编号等数字更容易记忆
- 传递性:在战场条件下,数字密钥能更可靠地传递
- 简便性:士兵只需极少的培训即可正确使用该密码
- 减少错误:数字种类更少(0-9)意味着加密出错的可能性更小
历史上的密钥选择
历史使用者通常选择有意义的数字密钥:
- 日期:重要日期,如 1648(威斯特伐利亚和约签署年)
- 数学常数:早期数学家可能使用 314159(圆周率)
- 部队编号:军事部队可能使用其团的编号
- 个人数字:出生年份或其他重要的个人日期
Python 实现
以下是一个用于学习目的的简单 Python 实现:
def gronsfeld_encrypt(plaintext, key):
result = []
key_index = 0
for char in plaintext.upper():
if char.isalpha():
shift = int(key[key_index % len(key)])
encrypted = chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
result.append(encrypted)
key_index += 1
else:
result.append(char)
return ''.join(result)
def gronsfeld_decrypt(ciphertext, key):
result = []
key_index = 0
for char in ciphertext.upper():
if char.isalpha():
shift = int(key[key_index % len(key)])
decrypted = chr((ord(char) - ord('A') - shift + 26) % 26 + ord('A'))
result.append(decrypted)
key_index += 1
else:
result.append(char)
return ''.join(result)
# 示例用法
print(gronsfeld_encrypt("HELLO", "314")) # 输出:KFPOP
print(gronsfeld_decrypt("KFPOP", "314")) # 输出:HELLO
常见错误及避免方法
错误 1:忘记密钥循环
密钥会持续循环重复。不要在单词边界或空格处重新开始密钥。
错误做法: 对第一个单词使用 314,然后对第二个单词重新从 3 开始 正确做法: 在整个消息中连续使用密钥序列
错误 2:将非字母字符计入密钥位置
非字母字符(空格、标点)不应推进密钥位置。
错误做法: 对包括空格在内的每个字符都推进密钥位置 正确做法: 只对字母 A-Z 推进密钥位置
错误 3:模运算方向错误
解密时要减去密钥数字,而不是相加。并且在取模之前始终加 26,以处理负数结果。
错误做法: (C - K) mod 26(可能产生负数结果) 正确做法: (C - K + 26) mod 26
挑战答案
挑战 1 答案
密文: LIPPS → 明文: HELLO
挑战 2 答案
密文: WKUHH EOLQG PLFH → 明文: THREE BLIND MICE
挑战 3 答案
密钥: 4(重复) 明文: COMP THIS IS A SECRET MESSAGE(如果使用密钥 4)
注意:根据实际密钥的不同,结果可能有所差异。使用我们的格朗斯费尔德解码器尝试不同的密钥。
相关资源
总结
格朗斯费尔德密码展示了多表替换加密的工作原理,同时比完整的维吉尼亚密码更易于学习。通过这些示例,您已经学会了:
- 如何通过将密钥数字与字母位置相加来加密消息
- 如何通过减去密钥数字(并正确处理环绕情况)来解密
- 为什么数字密钥在历史军事应用中具有实用价值
- 使用格朗斯费尔德加密时需要避免的常见错误
使用我们的交互工具进行练习,以巩固这些概念并提升您的密码分析技能!