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

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

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

mod nexponentpqdPdQ(p -1 mod q)

以上参数用中文余数算法解释

但是,RSA的C#.NET实现具有以下不同的参数集:

ModulusExponentPQDPDQDInverseQ

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

对于pqdPdQ ,映射是显而易见的,但关于其他参数我不确定。

如果我可以获得映射这些参数的帮助,那就太棒了

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

加密指数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#extended euclidean算法”你可以找到很多实现。 扩展的欧几里德算法将给出整数x和y,使得1 = e * x + phi * y。 x是e mod phi的倒数,因此设置D = x mod phi是需要的。

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