C++ 为rsa加密实现bignum库

C++ 为rsa加密实现bignum库,c++,rsa,division,arbitrary-precision,C++,Rsa,Division,Arbitrary Precision,因此,我当然知道有一些简单的解决方案,比如使用GMP库或许多其他任意精度库。这是为了上课,所以我不允许走这些路线。在我们建立了所有的操作之后,我们将能够实现RSA加密方案 我使用向量来存储以二进制表示的n位数字。我有转换到十进制以后,但我必须对二进制操作,只有转换显示 我已经成功地实现了加法、减法和乘法。我被划分和模块化操作困住了。。。特别是模幂运算。我至少在一个基本的层面上理解了算法,但似乎无法将其转换为适用于任意长度数字的代码。在没有外部库的情况下,我似乎找不到C++中的任何此类工作的例子。

因此,我当然知道有一些简单的解决方案,比如使用GMP库或许多其他任意精度库。这是为了上课,所以我不允许走这些路线。在我们建立了所有的操作之后,我们将能够实现RSA加密方案

我使用向量来存储以二进制表示的n位数字。我有转换到十进制以后,但我必须对二进制操作,只有转换显示

我已经成功地实现了加法、减法和乘法。我被划分和模块化操作困住了。。。特别是模幂运算。我至少在一个基本的层面上理解了算法,但似乎无法将其转换为适用于任意长度数字的代码。在没有外部库的情况下,我似乎找不到C++中的任何此类工作的例子。 一些具体问题:

除了调用我正在编写的除法函数并使用返回的余数,还有更好的方法对n位数字进行模运算吗

我真的很想看到一些优秀的C++例子,因为我根本不能遵循GMP源代码。
任何好的学习资源或帮助都将不胜感激。谢谢

您可以用除法模拟模运算。你的模运算相当于:

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
从数学上讲,你可以理解为什么这是有意义的。该算法是计算模幂运算的常用算法,在时间和空间上的运算与指数大小成对数,与基数大小成对数(即,即使对于巨大的数字,它也很快)


另外,一定要告诉你的教授,他不让你使用外部图书馆是愚蠢的。程序员可以学到的最重要的事情之一是什么时候懒惰(即,什么时候找到并使用库来做一些事情,而不是自己编写解决方案)

你可以用除法来模拟模运算。你的模运算相当于:

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
从数学上讲,你可以理解为什么这是有意义的。该算法是计算模幂运算的常用算法,在时间和空间上的运算与指数大小成对数,与基数大小成对数(即,即使对于巨大的数字,它也很快)


另外,一定要告诉你的教授,他不让你使用外部图书馆是愚蠢的。程序员可以学到的最重要的事情之一是什么时候懒惰(即什么时候找到并使用一个库来做一些事情,而不是在家里编写自己的解决方案)

Knuth,“半数值算法”对除法算法有一个简洁的描述。Knuth,“半数值算法”对除法算法有一个简洁的描述。真讨厌。这是一个很好的答案,直到哲学的成熟。“别人这样做了,你就不需要去做”和“别人这样做了,你就不需要去学习如何去做”之间是有区别的。牛顿研究达芬奇。他不只是记下他一生的笔记,然后说“f'it”。我不需要关心这是怎么回事,那个聪明人已经做到了。“知道什么时候懒惰是提高真实世界产出的一项基本技能。当你有工作时,你可以在谷歌上寻求帮助,你可以使用图书馆;所有人为的学术限制都消失了。是的,知道一些东西是如何工作的很好,但是如果你真的对大整数逻辑感兴趣的话,看看现有的库;编写自己幼稚、不完整、有缺陷的实现将是浪费时间。我同意。没有理由重新发明别人已经发明的轮子。我的观点是,当那个轮子坏了,而你完全不知道它应该如何工作时,你就被套住了。它不是产品;这是诀窍。毫无疑问,利用别人的辛勤工作,是什么让它起作用,你的未来就掌握在一个未知的人手中。你可以通过熟悉、学习、学习来控制它。这就是我的全部观点。我说的是真的,我真的很喜欢这个答案。非常好,谢谢。我不知道你的教育程度有多高,但我越是深造,我越是意识到正确的设计和有意的懒惰是重要的,你的项目越大,通过这些方式节省时间就越重要。为了记录,我试着在C++中写一个大整数库,这并不容易。我做这件事并不是为了一个特定的原因,只是为了看看我是否可以,过了一段时间我就放弃了