将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
, dP
和dQ
,映射是明显的,但关于其他参数我不确定。
如果我能得到映射这些参数的帮助就太好了
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);