在C#中生成私有RSA密钥

时间:2010-09-18 08:17:53

标签: c# encryption cryptography rsa

我有pqne的值,并希望计算私钥d。我怎么能这样做,有人可以给我一个C#代码示例吗?我使用BigInteger类来表示pqne的值,因此我假设d将是BigInteger同样。

3 个答案:

答案 0 :(得分:3)

来自Wikipedia

  

确定满足同余关系alt text

的d(使用模运算)      
      
  • 换句话说,ed - 1可以用totient(p - 1)(q - 1)平均分割。
  •   
  • 这通常使用扩展的欧几里德算法计算。
  •   
  • d保留为私钥指数。
  •   

扩展的欧几里德算法允许您查找整数,以便满足以下条件:

alt text

  

当a和b是互质时,扩展的欧几里得算法特别有用,因为x是模b的模乘法逆。

在此公式中设置aeb(p-1)(q-1)gcd(a, b)至1(因为要求e和φ(pq)为RSA算法中的互质)并求解x,为您提供dextended 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类倾向于用来计算模块化逆的算法)。