我有p
,q
,n
和e
的值,并希望计算私钥d
。我怎么能这样做,有人可以给我一个C#代码示例吗?我使用BigInteger
类来表示p
,q
,n
和e
的值,因此我假设d将是BigInteger
同样。
答案 0 :(得分:3)
来自Wikipedia:
确定满足同余关系
的d(使用模运算)
- 换句话说,ed - 1可以用totient(p - 1)(q - 1)平均分割。
- 这通常使用扩展的欧几里德算法计算。
- d保留为私钥指数。
扩展的欧几里德算法允许您查找整数,以便满足以下条件:
当a和b是互质时,扩展的欧几里得算法特别有用,因为x是模b的模乘法逆。
在此公式中设置a
至e
,b
至(p-1)(q-1)
和gcd(a, b)
至1(因为要求e和φ(pq)为RSA算法中的互质)并求解x
,为您提供d
。
extended Euclidean algorithm上的维基百科页面提供了有关如何编写算法来解决x和y的更多详细信息。例如,您可以使用此递归函数(在伪代码中):
function extended_gcd(a, b)
if a mod b = 0
return {0, 1}
else
{x, y} := extended_gcd(b, a mod b)
return {y, x-(y*(a div b))}
在.NET中,如果您只想生成一些RSA密钥,则不必自己实施RSA算法。您可以使用.NET框架中的RSA实现。
答案 1 :(得分:1)
这就是我做到的。
素数p = 7且q = 17
计算n = p * q = 119
计算f(n)=(p-1)*(q-1)= 96
计算d = e ^ -1 mod f(n),例如,d = 77
答案 2 :(得分:1)
简短的方法是计算 e 模(p-1)*(q-1)的倒数。实际上你只需要 p-1 和 q-1 的最小公倍数,但这不会给你太多(是的,有几个可能的值d ,这是正常的,它们都是等价的。)
如果您的BigInteger
类具有模块化逆方法,那么这将很容易:只需调用它即可。否则,您将不得不使用扩展的欧几里德算法自行计算(这是BigInteger
类倾向于用来计算模块化逆的算法)。