为实现RSA加密一个BIGNUM库(implementing a bignum library fo

2019-10-17 06:36发布

所以,我当然知道有作为使用GMP库或许多其他任意精度的图书馆这个如此简单的解决方案。 这是一流的工作,所以我不允许采取任何这些路线。 我们建立了我们所有的业务我们是领先了之后才能够做一个RSA加密方案。

我使用的载体来存储二进制表示n位数字。 我后来转换为十进制,但我必须在二进制操作,只能转换为显示器。

我已经成功地实施了加法,减法,乘法和。 我被困在分工和模块化操作......特别模幂。 我明白在一个基本水平至少算法,但不能似乎把它翻译成代码,将在任意长度的数字工作。 我似乎无法找到这种类型在C所做的工作的任何例子++无需外部库。

一些具体的问题:

有没有更好的方式来做到模上的N位数除了刚才打电话的分割功能我写,并使用剩余回来了?

我真的很想看到一些很好的C ++的例子,因为我不能在所有遵循GMP源代码好。

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

Answer 1:

你可以用假司模运算。 你的模操作相当于:

v = n - (n / m) * m

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

如果你停留在分裂你可以实现它就像你用手工执行长除法。 (你应该已经学会了如何在通过乘法和减法中学做到这一点。这是很容易翻译的过程中立足2.做一些在纸面上,如果你被卡住。如果你想要一个更高效的算法,你可能发现一个由像“任意精度除法算法”在谷歌搜索)

一旦你有模量,可以计算反复平方模幂。 观察,我们计算一些大的整数X到的67力量,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

在数学上,你可以看到为什么这是有道理的。 该算法是用于计算模块化幂的通常选择算法,并在时间和空间的对数以指数的大小和对数操作以将基体的大小(即它的快,即使对于庞大的数字)

PS请务必告诉你的教授,他是愚蠢的不是让你使用外部库。 一个程序员可以学到的最重要的事情是什么时候偷懒(即当找到并使用库做一些事情,而不是家酿自己的解决方案)



文章来源: implementing a bignum library for rsa encryption