我正在尝试用非常大的数字在C ++中实现RSA。我没有使用任何库。我想编写自己的代码:)所以我用字符串来存储这些大数字。大数的乘法和除法非常快,所以这不是问题。但是当我使用^ b modm进行加密或解密时,这非常慢。我使用p和q作为50位数字并尝试加密大约20个字符的文本。我花了一个小时来加密和解密。我通过平方法使用取幂来减少计算时间。我可以做些什么改进?
还有什么是产生素数的最好方法p& q。(最好是行业标准)
答案 0 :(得分:2)
我认为像任意精度算术库一样GMP包含一些非常仔细调整的函数(甚至是一些手工制作的声明代码)。
多精度算术算法非常复杂(并且不是很直观)。有关于这个主题的书籍(我已经借过一次,所有细节都难以掌握,除非你花了很多时间研究里面的数学)。
如果我在哪里,我会使用像GMP这样的现有库。
否则,花时间学习,阅读和学习硬数学。
答案 1 :(得分:2)
正如其他人所说,如果你想在你正在编写的东西中使用RSA,你应该使用经过良好测试的库而不是你自己的代码。但是,编写代码对学习东西非常有帮助,所以这样做绝对没有错。
我猜你减慢的速度是a ^ b mod m中^ b的计算,因为^ b将是一个非常大的数字。使用平方来计算这有助于运行时,但在获取模数之前,您仍然会得到巨大的中间数和巨大的结果。有更多的技巧可以更快地执行模幂运算,但维基百科比我更了解它们: http://en.wikipedia.org/wiki/Modular_exponentiation。我先看看那里。
我对RSA的行业状态一无所知,所以这只是推动正确的方向:因为素数测试通常很慢,对于p和q你可能想要“可能的素数”: http://en.wikipedia.org/wiki/Probable_prime
字符串听起来像是一种相当低效的方法。如果#1没有帮助,您可能需要查看java的BigInteger库,并在C ++中查找等效项,或者编写自己的库。这只会提供一个恒定的速度因素和内存使用改进,但是(除非检查代码显示您正在执行的某些事情的更好的算法),所以可能不值得花时间编写自己的。然而,采用别人可能仍然值得。
答案 2 :(得分:2)
在取幂期间进行平方/乘法后,是否进行了模块化缩减?你应该在每次平方/乘法后计算模数,这样中间结果就不应该超过m值的两倍。