为rsa加密实现bignum库

时间:2012-09-26 19:13:50

标签: c++ rsa division arbitrary-precision

当然,我知道有一些简单的解决方案,例如使用GMP库或许多其他任意精度库。这是为了上课,所以我不允许采取任何这些路线。在我们构建了所有操作之后,我们才能够进行RSA加密方案。

我使用向量来存储以二进制表示的n位数字。我稍后转换为十进制,但我必须对二进制文件进行操作,并且仅转换为显示。

我已经成功实现了加法,减法和乘法。我被困在分区和模块化操作......特别是模幂运算。我至少在基本层面上理解算法,但似乎无法将其转换为适用于任意长度数字的代码。我似乎无法找到在没有外部库的情况下用c ++完成的这类工作的任何例子。

一些具体问题:

除了只是调用我正在编写的除法函数并使用返回的余数之外,还有更好的方法对n位数进行模数?

我真的很想看到一些很好的c ++示例,因为我无法完全遵循GMP源代码。

任何好的学习资源或一些帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:1)

您可以使用除法进行模数运算。您的模数运算相当于:

v = n - (n / m) * m

其中n是除数,m是模数,v是输出值(所有任意精度数)

如果你被困在师,你就可以实现它,就像你手工进行长时间划分一样。 (你应该通过乘法和减法学习如何在中学这样做。很容易将过程转化为基础2.如果你被卡住,请在纸上做一些。如果你想要一个更有效的算法,你可能通过在谷歌搜索“任意精确分割算法”之类的东西来找到一个

一旦有模数,就可以通过重复平方来计算模幂运算。观察我们计算一些大的整数X到67的幂,mod N:

v1  = X mod N         // X^1 mod N
v2  = v1  * v1  mod N // X^2 mod N
v4  = v2  * v2  mod N // X^4 mod N
v8  = v4  * v4  mod N
v16 = v8  * v8  mod N
v32 = v16 * v16 mod N
v64 = v32 * v32 mod N // X^64 mod N

v66 = v64 * v2  mod N // X^66 mod N
v67 = v66 * v1  mod N // X^67 mod N

在数学上,你可以看出为什么这是有道理的。该算法是通常选择的用于计算模幂运算的算法,并且在时间和空间上以指数的大小对数运算,并且与基数的大小成对数(即,对于大数字而言,它是快速的)

P.S。确保你告诉你的教授他不会让你使用外部库是愚蠢的。程序员可以学习的最重要的事情之一是何时懒惰(即何时查找和使用库来做某事而不是自制解决方案)