本项目是一个基于Python实现的实验性加密程序,其设计灵感来源于二战时期的恩尼格玛密码机,但进行了显著的修改和扩展,特别是引入了多达20个转盘和支持5000常用汉字的大字符集。
本项目旨在探索经典密码机械原理与现代编程结合的可能性,并为密码学爱好者提供一个可供学习、实验和修改的平台。
本项目的主要灵感来源于著名的恩尼格玛密码机。恩尼格玛通过其精巧的转盘系统和步进机制,在当时提供了极高的加密强度。我们试图借鉴其核心思想——即通过多个动态变化的置换层来加密信息——并将其扩展到一个更大的字符集和更多的转盘数量,同时探索一种特定的链式加密路径和步进机制。
本加密系统通过以下核心组件和流程工作:
-
字符集 (ALPHABET):
- 系统支持一个包含约5000个常用汉字的字符集。所有明文输入和密文输出都基于这个字符集。
- 用户需要在代码中定义这个
ALPHABET字符串,并确保其中所有字符都是唯一的。
-
转盘 (Rotors):
- 数量:系统配置了20个转盘 (
NUM_ROTORS = 20)。 - “接线” (Wirings):每个转盘的内部“接线”由一个字符串表示,该字符串是
ALPHABET的一个精确的、预设的随机置换(即5000个汉字的打乱排列,无重复、无缺少)。这20个转盘的接线是固定的,并且收发双方必须拥有完全相同的接线配置。在开源代码中,攻击者会知道这些接线。 - 初始位置 (Initial Positions):在加密或解密开始前,用户需要为每个转盘设置一个初始的旋转位置。这20个初始位置共同构成了加密/解密的主要密钥。
- 数量:系统配置了20个转盘 (
-
步进机制 (Stepping Mechanism):
- 在加密(或解密)每个字符之前,转盘会根据一套类似恩尼格玛的进位逻辑进行步进,以改变其当前位置。
- R1 (最右/快轮,索引0):每处理一个字符,R1总是向前步进一格。
- R2 至 R20 (索引1至19):对于转盘 R_i (i > 0),如果其左侧的转盘 R_{i-1} 在本轮步进中被触发步进,并且 R_{i-1} 在其步进前恰好位于其预设的“槽口”(notch)位置,那么 R_i 也会被触发向前步进一格。
- 这个步进是连锁反应:R1的槽口可能触发R2,R2的槽口(如果R2也被触发)可能触发R3,以此类推,直到最后一个转盘。
- 每个转盘(通常是前19个)都有一个或多个预定义的槽口字符。
- 这种机制确保了转盘的整体配置在加密过程中不断地、复杂地变化,产生极长的状态周期。
-
加密路径 (Encryption Path):
- 当一个明文字符输入时,它首先根据其在
ALPHABET中的位置转换为一个索引。 - 这个索引会依次通过20个转盘(R1 -> R2 -> ... -> R20)。
- 对于每个转盘 R_i:
- 根据 R_i 当前的旋转位置
rotor_positions[i],其原始“接线”rotor_wirings[i]会形成一个当前的“有效移位后转盘状态”current_shifted_rotors[i]。 - 上一级传入的索引被用于在
current_shifted_rotors[i]中查找到一个输出字符。 - 如果 R_i 不是最后一个转盘,则这个输出字符会根据其在
ALPHABET中的位置转换为一个新的索引,传递给下一个转盘 R_{i+1}。 - 如果 R_i 是最后一个转盘 (R20),则其输出字符即为该明文字符对应的最终密文字符。
- 根据 R_i 当前的旋转位置
- 这是一个单向的链式替换过程。
- 当一个明文字符输入时,它首先根据其在
-
与经典恩尼格玛机的显著区别:
- 无反射器 (No Reflector):本设计不包含反射器。这意味着加密和解密过程不是对称的(即使用相同设置对密文再次加密不会得到明文),需要独立的解密逻辑(逆向通过转盘并使用逆映射)。这也意味着一个字符有可能被加密成它自身。
- 无插线板 (No Plugboard):本设计未模拟恩尼格玛机的插线板功能。
- 大字符集:支持约5000个常用汉字,远超原始恩尼格玛的26个字母。
- 多转盘:使用20个转盘进行多层加密变换。
- 动态步进机制:复杂的、类似恩尼格玛的转盘联动步进,确保加密状态的持续变化。
-
巨大的理论密钥空间:仅20个转盘的初始位置组合就产生了
$5000^{20} \approx 2^{246}$ 种可能性,使得暴力破解初始设置在计算上不可行。
-
环境要求 (Prerequisites):
- Python 3.x
-
数据准备 (Data Preparation) - [非常重要!] 在你运行代码之前,必须在Python脚本中修改以下占位符数据:
ALPHABET: 一个包含你选定的约5000个唯一常用汉字的字符串。rotor_wirings: 一个包含20个字符串的Python列表。列表中的每个字符串都必须是你定义的5000字ALPHABET的一个精确的随机置换(即包含所有5000个汉字,每个汉字只出现一次,但顺序被打乱)。生成这些高质量的随机置换是保证理论强度的关键。rotor_notch_chars: 一个包含20个元素的Python列表,指定前19个转盘的槽口字符(这些字符必须在你的ALPHABET中),最后一个转盘的槽口通常设为None(因为它不触发其他转盘)。槽口的选择会影响步进的模式和频率。
请参考代码中标注为
!!! 用户替换区 !!!的部分进行修改。 -
运行脚本 (Running the Script):
- 将加密代码保存为例如
encrypt_enigma_20r.py,解密代码保存为例如decrypt_enigma_20r.py。 - 在终端中运行:
python encrypt_enigma_20r.py(或解密脚本)。 - 程序会提示你输入明文(或密文)。
- 随后,程序会提示你为20个转盘分别输入其初始位置对应的单个汉字。这些初始位置共同构成加密/解密的密钥。
- 将加密代码保存为例如
-
解密 (Decryption):
- 解密时,必须使用与加密时完全相同的
ALPHABET、rotor_wirings、rotor_notch_chars配置。 - 最重要的是,解密时输入的20个转盘的初始位置必须与加密时使用的密钥完全一致。
- 解密时,必须使用与加密时完全相同的
-
开源目的: 本项目主要用于密码学原理学习、算法设计实验和编程实践。它旨在提供一个具体的、可操作的例子,来探索经典密码机械的设计思想如何在大规模字符集和多层结构下表现。
-
安全警告:
- 这是一个实验性的密码算法。尽管其参数(如密钥空间)在理论上可能显得非常大,但其设计是新颖的,未经任何正式的、独立的、公开的密码学分析或安全审计。
- 严正警告:请勿将此程序用于加密任何真实的敏感信息、商业数据或用于任何生产环境。其安全性是未经验证的,可能存在未知的严重缺陷。
- 遵循密码学的基本告诫:除非你是密码学专家并且你的设计经过了严格且广泛的公开审查,否则不要自行设计并使用未经验证的密码算法来保护重要数据 ("Don't roll your own crypto")。 对于实际的安全需求,请务必使用经过全球密码学界广泛审查和公认安全的标准加密算法(例如AES)。
- 根据科克霍夫原则 (Kerckhoffs's Principle),本算法的安全性应仅依赖于密钥(即20个转盘的初始位置)的保密,算法的实现和转盘接线等参数(在知晓代码后)被认为是公开的。
- 从外部文件(如JSON或CSV)加载
ALPHABET、rotor_wirings和rotor_notch_chars配置,以提高灵活性和易用性。 - 实现类似恩尼格玛的反射器 (Reflector),使得加密和解密操作可以使用完全相同的设置和流程。
- 为系统增加插线板 (Plugboard) 机制的模拟,以进一步增强复杂度。
- 研究和实现更多样化、更复杂的转盘步进模式。
- 对算法进行初步的统计测试(例如雪崩效应测试、随机性测试)。
- 考虑使用更高效的数据结构和算法优化性能,特别是针对5000字符集和20个转盘的操作。
本项目采用 MIT许可证 。
欢迎对本项目提出任何建议、发现的潜在问题(请通过 [zhaojerry114514@gmail.com]私下联系)、或者参与代码的改进。如果你对密码学感兴趣,希望这个项目能为你提供一个有趣的探索起点。
请在使用前,务必仔细阅读并理解此 README.md 的所有内容,特别是“数据准备”和“安全声明”部分。# Enigma-CN