是否有非对称加密/解密例程的简单示例?

信息安全 加密 不对称
2021-09-04 14:21:05

我可以很好地理解 Java、Perl 和 JavaScript 代码。其余的,我没有研究过,但我想我可以弄清楚如何阅读/翻译。

我想知道最简单的非对称例程是什么。是否真的太复杂而不想担心?

我真的很好奇怎么可能有一个仅加密的密钥!它可以抵抗逆向工程对我来说似乎很神奇,所以我想知道它是如何工作的!

  1. 是不是太复杂了。
  2. 我可以查找实现的最简单的标准非对称加密例程(之一)是什么?
  3. 如果您碰巧有任何最小的代码示例,那就太好了。

我已经检查了Wikipedia 上关于 How It Works 的段落,但没有数学分解或实现描述,只有很多实现我真的不想随机选择看哪一个,我也不想选择最常见的,我认为最强大和最复杂的。

有什么想法吗?

4个回答

就 RSA 而言,提供了一个可以遵循的很好的示例,并显示了输入和输出的相应示例。演示应用程序将引导您完成各个步骤并让您检查工作。有时,只需按您的方式通过类似的步骤进行操作就会有所帮助。对于 Wikipedia 文章,您需要查看实际的算法文章:RSA对应的数学。

实施方面,您可以在 Java中用 30 行代码清楚地将其组合在一起。

为了您的理解,不存在仅加密密钥之类的东西。相反,有两个相等的键可以反转其合作伙伴的操作。我们任意将一对中的一个指定为私有的,一个指定为公共的。用一个密钥加密的东西可以用另一个密钥解密。这是用于签名的原则。

使密钥安全的不是反逆向工程问题,而是一个数学概念,您无法合理地检查大量密钥空间(当密钥使用非常大的数字空间时)以找到匹配的密钥。保理工作没有真正的加速。

还有其他非对称密钥算法需要学习,但是当你盯着我看时,我会首先尝试了解最古老和最常见的 RSA。

我整理了一个使用 python 的 RSA 演示(python 很容易阅读,即使你以前从未见过它)。代码足够长,以至于不能放在单个页面上,但足够短,您可以在几分钟内阅读和理解它。

由于加密/解密可以在一个内置命令中完成exp(PLAINTEXT,KEY,MODULUS)——我也经历了整个密钥派生过程。

你可以在这里找到代码: https ://gist.github.com/1239116

当您运行代码时,它会要求您以>12345or的形式输入<12345,其中>前缀告诉它将私钥应用于数字,而<告诉它应用公钥。为了简单起见,它只编码数字;但是一旦你有了它,编码任意数据只是一个格式化的问题。

归功于Jeff 的详细回答和Steve 的回答,这也很有帮助。归功于 tylerl 的回答,其中包括所有功能的 Wikipedia 链接,特别是modInverse它还澄清了e. 谢谢,我赞成您的答案,并使用所有三个答案的组合信息,我创建了我希望是一个更好的答案。

使逆向工程如此昂贵的关键是使用power-of平方根并不难,3 的幂意味着你需要一个立方根,但是 34,051,489 的幂是相当困难的。还有其他难以逆向工程的数学运算。还有多种方法可以创建非对称算法,但此答案侧重于 RSA。最古老和最常见的。

RSA 算法(基于Java 代码

以下计算应使用任意精度整数完成(如 BigInt 或 BigInteger)

生成密钥:

  • 恒定密钥长度为l.
  • e_start为了简单起见,通常可以使用常量=3然而,0x10001更常见的是,无论如何,质数是最好的(出于密钥生成性能的原因,可能还有其他原因)。
  • pq是随机生成的正素数,需要最多l位进行存储。(为了保持这些积极性,第一位将永远是0
  • n=p*q这用于加密和解密。
  • e开始于e_start. 这最终将成为加密密钥的一部分。
  • m=(p-1)*(q-1)用于转换ed,将用于解密。
  • while(gcd(e,m)>1){e+=2} 这是下一步工作所必需的。
  • d=modInverse(e,m)这执行标准的算术运算。可能不值得检查太多,特别是如果您的编程语言内置了这个

要加密或解密,首先将您的字节转换为单个任意精度整数。

加密: encrypted=(plain^e)%n

注意:如果plain>=n,则必须拆分plain为两个或多个较小的值并分别加密。

解密: plain=(encrypted^d)%n

非对称加密的效率通常低于对称加密。有时非对称加密仅用于密钥交换。

实际上,据我所知,围绕它的数学非常简单。你取一个非常大的素数(数千位)的幂的值,然后从另一个数字做一个 mod。

所以要加密你有这样的东西: EncryptedBits = (PlainText ^ YourPublicKey) % Modulus

并且要解密你有类似的东西:PlainText = (EncryptedBits ^ YourPrivateKey) % Modulus

我在这里遇到了一个非常容易阅读的文档:http: //mathaware.org/mam/06/Kaliski.pdf

不过,我不确定要查看的任何库。