归功于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
非对称加密的效率通常低于对称加密。有时非对称加密仅用于密钥交换。