Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

转轮加密之安全性和细节 #30

Open
SheepChef opened this issue Nov 21, 2024 · 8 comments
Open

转轮加密之安全性和细节 #30

SheepChef opened this issue Nov 21, 2024 · 8 comments
Labels
缺陷 有缺陷的代码问题 议题 一个长期功能议题

Comments

@SheepChef
Copy link
Owner

SheepChef commented Nov 21, 2024

转轮加密的目的

转轮加密之前的原文,是一个Base64字符串,转轮加密对其的处理为彻底打乱Base64字符串的字母/数字/符号,使其无法被正常解码为下一层AES256加密后的字节数据(包括两字节IV在内)

转轮轮转细节

  1. 对密钥进行SHA256

  2. 对SHA256后得到的32字节数组中的每个元素执行对十取余,得到一个操作数数组(这个数组中每个元素的大小不超过9,不小于0)

  3. 加密时,每加密/映射一个字符,就取当前操作数,执行一次转轮轮转,并将当前操作数的索引偏移一位,下次加密便会从操作数数组中取下一个操作数执行转轮轮转。如果取到数组末尾,则从头开始,循环往复。

轮转方向和距离由当前操作数(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

  1. 在原字符串中找到字符 a 的索引,得到 0
  2. 在第一个转轮中查找索引 0,得到字符 b
  3. 在原字符串中查找字符 b 的索引,得到 1
  4. 在第二个转轮中查找索引 1,得到字符 d
  5. 在原字符串中查找字符 d 的索引,得到 3
  6. 在第三个转轮中查找索引 3,得到字符 i

由此完成了 a --> i 的转轮映射
其他所有字符以此类推,均可得到一个映射
(这个映射可以和原文本相同,修正了Enigma机的弱点)

每移动一次转轮,都会得到一个完全不同的映射表。

字母和数字/符号的转轮是分开的,即两组共六个转轮。

密钥的安全性

假设攻击者设法获得了一个操作数数组,且这个操作数数组正是正确解密所需的数组。

由于操作数数组的每个元素均对十取余,在255(一字节)的十进制数字范围中,每个操作数至少有24个原始可能值。

那么,从这个数组中,能够至少得到24^32组可能的哈希序列,即1.468 * 10^44种可能。

密文的哈希为1/10^44(这还仅仅是哈希!)

三重转轮足够保障密钥哈希的安全,更加可以确保密钥本身的安全。

明文安全性

假设我是攻击者:

  1. 需要先搜索10^32种可能的操作数序列(用世界上最快的计算机搜索,需要21139年)

  2. 找到一个合适的序列后,其对应的哈希至少有10^44种可能,由于密钥重用,AES256加密的可能密钥空间也缩小到了10^44(本来是2^256≈10^77)。

  3. 要破解10^44种可能密钥,按照现今世界上最快的计算机,每秒执行 1.5 * 10^20次计算,也需要 3 * 10^16年,超过宇宙的寿命好几个数量级。

  4. 总结, 破解密文需要 21139 + 3 * 10^16 年

其他研究

我在设计这种加密算法的时候参考了Enigma机器的实现原理。

欢迎密码学专业人士批评指正。

@SheepChef SheepChef added the 议题 一个长期功能议题 label Nov 21, 2024
@SheepChef
Copy link
Owner Author

如果你读完了这些,可能会问:

看起来转轮加密反而削减了密钥空间,降低了破解难度,还有整它的必要吗?

我的答案是:当然!

本加密的最终映射是密本,也就是几百个中文字符。如果没有转轮,那么只有十个字符能够映射一个原文字符。

如果增加了转轮,那么一个原文字符便有上百种可能的映射,显著增加了密文的随机性。

这么说可能不太好理解,让我举例而言:

假设我们要加密一串规律性很强的文本

aaaaaaaaaaaaaaaaaaa

没有转轮:
个将将请个人之到将之中之个人上上上等上

有转轮:
个发而由在及但玫网只夏捷夕惠新小悦起霁

密文的差异显而易见!

@SheepChef SheepChef pinned this issue Nov 21, 2024
@332plim
Copy link

332plim commented Nov 29, 2024

轮转的另一个价值是增大大规模审查的成本。可以预计的情况是加密后的密文会和密钥一起公开,否则就失去了公开评论的意义。轮转这种私有的编码方案可以增大审查者的自动化成本

@SheepChef
Copy link
Owner Author

SheepChef commented Dec 2, 2024

潜在弱点 1st —— 轮转周期

和Enigma一样,转轮加密的映射具有周期性。即其对应关系在一定次数的操作数轮回之后,回到首次轮转时的状态。

由于本加密工具的操作数数组为32个元素,其周期也一定是32的整数倍。

但与Enigma不同的一点,在于其周期长度由密钥决定,不可预测。

PoC

我将转轮加密机制从主程序中抽离出来进行单独测试。

给定一个极端原文输入(实际加密时绝不可能出现如此规律的原文)

明文:
HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello......(x500)

密钥:
test

密文:
ItRsuqoDxpfezBkdoOBMerNoswJYbMrlAbjCWCeOzPrNcmxbWmsXVZSqAjzjvmjAYlJsMGgEQKvUpdU.... 
(2080 letters after....)
ItRsuqoDxpfezBkdoOBMerNoswJYbMrlAbjCWCeOzPrNcmxbWmsXVZSqAjzjvmjAYlJsMGg......

周期:
2080/32 = 65

在上述给定密文和上述给定密钥的条件下,操作数列表完全迭代65次(轮转2080次)后,转轮的对应关系开始发生重复。

实际上的攻击面

如前述,简单的数学论证可以证明,即使攻击者找到了一个正确解密的操作数数组,实际的密钥仍然有10^44种可能。

在本项目中,转轮加密之前的原文是一个经过AES256加密之后编码而成的Base64字符串。AES256加密后数据的高香农熵,确保了即使转轮存在周期性,实际输出的结果也绝不可能存在任何意义上的周期性。因而,现行算法和AES256搭配使用非常安全,在密钥未知的情况下,因为没有任何重复明文可供利用,攻击者因而也无法得知轮转周期究竟是多少。

本加密方法的轮转周期不可预测,因为它完全取决于每个操作数的大小和奇偶性,更换不同的密钥,周期也会随之改变。唯一的特征是:周期永远是32的整数倍。

可能的改进措施

引入一个明文和密钥共同决定的轮转机制有助于解决此问题。

目标是让每一个轮转步骤的明文字符,都成为它之后所有轮转步骤的子密钥。

这么做可以让转轮加密生成一个和明文长度一样的映射组合序列,从而消除所有周期性。

@SheepChef SheepChef added the 缺陷 有缺陷的代码问题 label Dec 2, 2024
@icm-ai
Copy link

icm-ai commented Dec 16, 2024

麻了

@shelken
Copy link

shelken commented Dec 16, 2024

大规模应用的可能性有吗?指每个人在公共平台使用,自动本地加解密

@SheepChef
Copy link
Owner Author

大规模应用的可能性有吗?指每个人在公共平台使用,自动本地加解密

本项目是外壳/内核分离的,易于移植到其他地方。

“自动”加密并不好实现,解密倒是较简单。

未来的浏览器插件也许会引入更加快速的加密/解密入口,比如右键菜单。

@gt-888
Copy link

gt-888 commented Dec 24, 2024

原数据 -> 压缩 -> AES-256-CTR -> Base64 -> 三重转轮 / 映射汉字 -> 密文
Base64、三重转轮没有必要,用16进制可以缩短长度,建议增加其它加密算法
原数据 -> 压缩 -> AES-256 -> Serpent/Twofish/Camellia/Kuznyechik/ChaCha20 -> 16进制映射汉字 -> 密文

@SorenEricMent
Copy link

原数据 -> 压缩 -> AES-256-CTR -> Base64 -> 三重转轮 / 映射汉字 -> 密文 Base64、三重转轮没有必要,用16进制可以缩短长度,建议增加其它加密算法 原数据 -> 压缩 -> AES-256 -> Serpent/Twofish/Camellia/Kuznyechik/ChaCha20 -> 16进制映射汉字 -> 密文

增加一层密码学安全的对称加密没有实际意义

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
缺陷 有缺陷的代码问题 议题 一个长期功能议题
Projects
None yet
Development

No branches or pull requests

6 participants