当然,我知道有一些简单的解决方案,例如使用GMP库或许多其他任意精度库。这是为了上课,所以我不允许采取任何这些路线。在我们构建了所有操作之后,我们才能够进行RSA加密方案。
我使用向量来存储以二进制表示的n位数字。我稍后转换为十进制,但我必须对二进制文件进行操作,并且仅转换为显示。
我已经成功实现了加法,减法和乘法。我被困在分区和模块化操作......特别是模幂运算。我至少在基本层面上理解算法,但似乎无法将其转换为适用于任意长度数字的代码。我似乎无法找到在没有外部库的情况下用c ++完成的这类工作的任何例子。
一些具体问题:
除了只是调用我正在编写的除法函数并使用返回的余数之外,还有更好的方法对n位数进行模数?
我真的很想看到一些很好的c ++示例,因为我无法完全遵循GMP源代码。
任何好的学习资源或一些帮助将不胜感激。感谢
答案 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。确保你告诉你的教授他不会让你使用外部库是愚蠢的。程序员可以学习的最重要的事情之一是何时懒惰(即何时查找和使用库来做某事而不是自制解决方案)