归功于Jeff 的详细回答和Steve 的回答,这也很有帮助。也归功于 tylerl 的回答,其中包括所有功能的 Wikipedia 链接,特别是modInverse
它还澄清了e
. 谢谢,我赞成您的答案,并使用所有三个答案的组合信息,我创建了我希望是一个更好的答案。
使逆向工程如此昂贵的关键是使用power-of。平方根并不难,3 的幂意味着你需要一个立方根,但是 34,051,489 的幂是相当困难的。还有其他难以逆向工程的数学运算。还有多种方法可以创建非对称算法,但此答案侧重于 RSA。最古老和最常见的。
RSA 算法(基于Java 代码)
以下计算应使用任意精度整数完成。(如 BigInt 或 BigInteger)
生成密钥:
- 恒定密钥长度为
l
.
e_start
为了简单起见,通常可以使用常量=3
。然而,0x10001
更常见的是,无论如何,质数是最好的(出于密钥生成性能的原因,可能还有其他原因)。
p
和q
是随机生成的正素数,需要最多l
位进行存储。(为了保持这些积极性,第一位将永远是0
)
n
=p*q
这用于加密和解密。
e
开始于e_start
. 这最终将成为加密密钥的一部分。
m
=(p-1)*(q-1)
用于转换e
为d
,将用于解密。
while(
gcd
(e,m)>1){e+=2}
这是下一步工作所必需的。
d=
modInverse
(e,m)
这执行标准的算术运算。可能不值得检查太多,特别是如果您的编程语言内置了这个
要加密或解密,首先将您的字节转换为单个任意精度整数。
加密: encrypted=(plain^e)%n
注意:如果plain>=n
,则必须拆分plain
为两个或多个较小的值并分别加密。
解密: plain=(encrypted^d)%n
非对称加密的效率通常低于对称加密。有时非对称加密仅用于密钥交换。