将RSA加密参数从CRT(中文剩余定理)映射到.net格式

本文关键字:定理 映射 格式 net 余定理 加密 RSA 参数 中文 CRT | 更新日期: 2023-09-27 17:50:49

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

我有一个私钥,参数如下:

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

以上参数在中文余数算法中说明

然而c#。NET实现的RSA有不同的参数设置如下:

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

当我试图将数据从CRT映射到DOTNET时,我得到错误Bad Data

对于p, q, dPdQ,映射是明显的,但关于其他参数我不确定。

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

将RSA加密参数从CRT(中文剩余定理)映射到.net格式

mod n映射到Modulus, p -1 mod q映射到InverseQ,加密指数映射到Exponent,解密指数映射到D

加密指数e与解密指数d的关系为e*d = 1 mod (p-1)(q-1)。因此,如果您有其中一个,您可以很容易地从system . numeric . 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的倒数,因此需要设置D = x mod

扩展欧几里得算法可用于计算模逆,在这种情况下将计算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;
}

D可以这样计算:

    var qq = BigInteger.Multiply(phi, n);
    var qw = BigInteger.Multiply(phi, qq);
    BigInteger D = BigInteger.ModPow(e, (qw - 1), phi);