【问题标题】:exponentiation RSA求幂 RSA
【发布时间】:2011-11-05 19:13:25
【问题描述】:

我正在尝试在 C++ 中为非常大的数字实现 RSA。我没有使用任何库。我想编写自己的代码 :) 所以我使用字符串来存储这些大数字。大数的乘法和除法非常快,所以这不是问题。但是当我进行加密或解密时,即使用 a^b modm 这非常慢。我使用 p 和 q 作为 50 位数字并尝试加密大约 20 个字符的文本。我花了一个小时来加密和解密。我使用平方方法求幂来减少计算时间。我可以做哪些改进?

还有什么是生成素数 p 和 q 的最佳方法。(最好是行业标准)

【问题讨论】:

  • 如果这不是为了学习如何(不)实现 RSA,请停止并使用经过良好测试的高级库。
  • 众所周知,RSA 是一种缓慢的方法,这就是为什么 RSA 主要用于传输会话密钥以实现更快的共享密钥方法。

标签: c++ rsa


【解决方案1】:

在求幂过程中,您是否在平方/乘法之后进行模减少?您应该在每次平方/乘法后计算模数,因此中间结果不应超过 m 值的两倍。

【讨论】:

  • 好建议,我敢打赌这就是问题所在。
【解决方案2】:

我认为任意精度的算术库,例如GMP 包含一些经过仔细调整的函数(甚至一些手工汇编代码)。

而且多精度算术算法非常复杂(而且不是很直观)。有这方面的书(我借过一次,很难掌握所有细节,除非你花很多时间研究里面的数学)。

如果我在你那里,我会使用一些现有的库,如 GMP。

或者,花时间学习、阅读和学习困难的数学。

【讨论】:

    【解决方案3】:

    正如其他人所说,如果您希望在编写的东西中使用 RSA,您应该使用经过良好测试的库而不是您自己的代码。但是,编写代码对于学习东西非常有帮助,所以这样做绝对没有错。

    1. 我猜想让你慢下来的是 a^b 在 a^b mod m 中的计算,因为 a^b 将是一个非常大的数字。使用平方来计算这在一定程度上有助于运行时间,但在取模之前,您仍然会得到巨大的中间数字和巨大的结果。有很多技巧可以更快地执行模幂运算,但 wikipedia 比我更了解它们: http://en.wikipedia.org/wiki/Modular_exponentiation 。我先看看那里。

    2. 我对 RSA 的行业状况一无所知,所以这只是朝着正确方向的推动:由于素数测试通常很慢,对于 p 和 q,您可能需要“可能的素数”: http://en.wikipedia.org/wiki/Probable_prime

    3. 字符串听起来是一种相当低效的方法。如果 #1 没有帮助,您可能需要查看 java 的 BigInteger 库,并在 C++ 中找到等效的库,或者编写自己的库。然而,这只会提供一个恒定的速度和内存使用改进因素(除非检查代码显示您正在执行的某些事情的更好算法),因此可能不值得花时间编写自己的。不过,采用别人的可能仍然值得。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-31
      • 2018-12-15
      • 2015-03-01
      • 2017-08-28
      • 2020-09-11
      • 2018-05-27
      • 2011-08-25
      • 1970-01-01
      相关资源
      最近更新 更多