6

我需要使用 C# 实现 RSA 加密/解密

我有一个带有以下参数的私钥:

mod n, exponent, p, q, dP, dQ, 和(p-1mod q)

以上参数在中文余数算法中有解释

然而,RSA 的 C#.NET 实现具有不同的参数集,如下所示:

Modulus, Exponent, P, Q, DP, DQ, D,InverseQ

当我尝试将数据从 映射CRT到 时DOTNET,出现错误Bad Data

对于 p, q,dPdQ映射是显而易见的,但关于其余参数我不确定。

如果我能获得映射这些参数的帮助,那就太好了

4

3 回答 3

6

mod n映射到Modulus,映射到,加密指数映射到,解密指数映射到。p-1mod qInverseQExponentD

加密指数e和解密指数d通过 e*d = 1 mod (p-1)(q-1) 相关。因此,如果您有一个,您可以使用 System.Numerics.BigInteger 类中的一些方法轻松派生另一个。

var Pminus1 = BigInteger.Subtract(P, BigInteger.One);
var Qminus1 = BigInteger.Subtract(Q, BigInteger.One);
var Phi = BigInteger.Multiply(Pminus1, Qminus1);
var PhiMinus1 = BigInteger.Subtract(Phi, BigInteger.One);
// var D = BigInteger.ModPow(E, PhiMinus1, Phi);

请注意,在构造 .NET BigInteger 时必须小心,特别是如果您习惯于 Java 的 BigInteger 类。有关更多信息,请参阅此问题

编辑 :

正如 CodeInChaos 指出的最后一行是错误的!

错误的!错误的!错误的!

我很尴尬。在向邪恶力量低头时,BigInteger 类没有模块化的逆方法,也没有扩展的欧几里得算法方法。不过,您可以在谷歌上搜索“c#扩展欧几里得算法”,您可以找到许多实现。扩展欧几里得算法将为您提供整数 x 和 y,使得 1 = e*x + phi * y。x 是 e mod phi 的倒数,因此需要设置 D = x mod phi。

于 2013-01-07T12:10:37.827 回答
2

扩展欧几里得算法可用于计算模逆,在这种情况下将计算 D,使用此链接:http ://www.di-mgt.com.au/euclidean.html#extendedeuclidean获取详细信息,我测试了C#中的源代码如下,结果是匹配的,

public static BigInteger modinv(BigInteger u, BigInteger v)
{
   BigInteger inv, u1, u3, v1, v3, t1, t3, q;
   BigInteger iter;
   /* Step X1. Initialise */
   u1 = 1;
   u3 = u;
   v1 = 0;
   v3 = v;
   /* Remember odd/even iterations */
   iter = 1;
   /* Step X2. Loop while v3 != 0 */
   while (v3 != 0)
   {
       /* Step X3. Divide and "Subtract" */
       q = u3 / v3;
       t3 = u3 % v3;
       t1 = u1 + q * v1;
       /* Swap */
       u1 = v1; v1 = t1; u3 = v3; v3 = t3;
       iter = -iter;
   }
   /* Make sure u3 = gcd(u,v) == 1 */
   if (u3 != 1)
       return 0;   /* Error: No inverse exists */
       /* Ensure a positive result */
       if (iter < 0)
           inv = v - u1;
       else
           inv = u1;
       return inv;
}
于 2016-07-05T08:33:20.050 回答
0

D可以这样计算:

    var qq = BigInteger.Multiply(phi, n);
    var qw = BigInteger.Multiply(phi, qq);
    BigInteger D = BigInteger.ModPow(e, (qw - 1), phi);
于 2014-05-31T10:58:05.810 回答