加密和混淆管线
魔曰使用 AES-256-CTR 作为核心加密算法。使得密文的安全性有强力保证。
AES-256
魔曰会将用户提供的密钥,执行一次 SHA256 哈希,取其值作为密钥。
然后,对第一次哈希的结果附加两个随机字节,再次哈希,取其值作为加密的 IV。
三重转轮混淆
转轮混淆之前的原文,是一个使用 AES 加密后数据编码而成的 Base64 字符串,转轮混淆对其的处理为彻底打乱 Base64 字符串的字母/数字/符号,使其无法被正常解码为上一层 AES256 加密后的字节数据(包括两字节 IV 在内)。
密钥和操作数
- 对密钥进行 SHA256
- 对 SHA256 后得到的 32 字节数组中的每个元素执行对十取余,得到一个操作数数组(这个数组中每个元素的大小不超过 9,不小于 0)
轮转规则
混淆时,每混淆/映射一个字符,就取当前操作数,执行一次转轮轮转,并将当前操作数的索引偏移一位。
下次加密便会从操作数数组中取下一个操作数执行转轮轮转。如果取到数组末尾,则从头开始,循环往复。
轮转方向和距离由当前操作数(N)决定。
遵守以下规则:
- 如果操作数为 0,将其当作 10 并继续
如果该操作数是偶数(N%2 == 0)
- 将第一个密钥轮向右轮 6 位
- 将第二个密钥轮向左轮 N*2 位
- 将第三个密钥轮向右轮(N/2)+1 位
如果该操作数是奇数(N%2 != 0)
- 将第一个密钥轮向左轮 3 位
- 将第二个密钥轮向右轮 N 位
- 将第三个密钥轮向左轮(N+7)/2 位
其中,第一个和第三个转轮为顺序轮,第二个转轮为乱序(手动打乱)轮。
转轮每次转动方向和距离由操作数组(密钥)决定 可能的密钥空间为 10^32。
映射规则
映射采用 字母 -> 索引 -> 字母 -> 索引 的重复操作。
设立一个原映射标准字符串(实际比这个要长得多)
abcdefjhigk....
三个转轮的长度和原字符串一致。 假设三个转轮状态如下。 (下一个字符加密时会轮转)
bcdefjhigka....
edfbjichgak....
fjhigkabcde....
现在,假设我们要混淆字符 a
- 在原字符串中找到字符 a 的索引,得到 0
- 在第一个转轮中查找索引 0,得到字符 b
- 在原字符串中查找字符 b 的索引,得到 1
- 在第二个转轮中查找索引 1,得到字符 d
- 在原字符串中查找字符 d 的索引,得到 3
- 在第三个转轮中查找索引 3,得到字符 i
由此完成了 a --> i 的转轮映射。
其他所有字符以此类推,均可得到一个映射。
(这个映射可以和原文本相同,修正了 Enigma 机的弱点)
每轮转一次转轮,都会得到一个完全不同的映射表,轮转规则见上一小节。