将RSA加密参数从CRT(中国剩余定理)映射到.NET格式
我需要使用C#实现RSA加密/解密
我有一个包含以下参数的私钥:
mod n
, exponent
, p
, q
, dP
, dQ
和(p
-1
mod q)
以上参数用中文余数算法解释
但是,RSA的C#.NET实现具有以下不同的参数集:
Modulus
, Exponent
, P
, Q
, DP
, DQ
, D
, InverseQ
当我试图将数据从CRT
映射到DOTNET
,我收到错误Bad Data
错误
对于p
, q
, dP
和dQ
,映射是显而易见的,但关于其他参数我不确定。
如果我可以获得映射这些参数的帮助,那就太棒了
mod n
映射到Modulus
, p
-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);