C# 将RSA加密参数从CRT(中国剩余定理)映射到.NET格式
我需要使用C#实现RSA加密/解密 我有一个具有以下参数的私钥:C# 将RSA加密参数从CRT(中国剩余定理)映射到.NET格式,c#,.net,c,rsa,chinese-remainder-theorem,C#,.net,C,Rsa,Chinese Remainder Theorem,我需要使用C#实现RSA加密/解密 我有一个具有以下参数的私钥: mod n,exponent,p,q,dP,dQ,和(p-1mod q) 上述参数在中进行了解释 但是,RSA的C#.NET实现具有不同的参数设置,如下所示: 模数,指数,p,Q,DP,DQ,D,InverseQ 当我试图将数据从CRT映射到DOTNET时,我得到了错误错误数据 对于p、q、dP和dQ而言,映射是显而易见的,但关于其余参数,我不确定 如果我能得到帮助将这些参数映射到mod n映射到module,p-1mod q映射
mod n
,exponent
,p
,q
,dP
,dQ
,和(p
-1
mod q)
上述参数在中进行了解释
但是,RSA的C#.NET实现具有不同的参数设置,如下所示:
模数
,指数
,p
,Q
,DP
,DQ
,D
,InverseQ
当我试图将数据从CRT
映射到DOTNET
时,我得到了错误错误数据
对于p
、q
、dP
和dQ
而言,映射是显而易见的,但关于其余参数,我不确定
如果我能得到帮助将这些参数映射到
mod n
映射到module
,p
-1
mod q
映射到InverseQ
,加密指数映射到指数,解密指数映射到D
,那就太好了
加密指数e
和解密指数d
由e*d=1模(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。D可以这样计算:
var qq = BigInteger.Multiply(phi, n);
var qw = BigInteger.Multiply(phi, qq);
BigInteger D = BigInteger.ModPow(e, (qw - 1), phi);
扩展欧几里德算法可用于计算模逆,在这种情况下,将计算D,使用此链接:获取细节,
我在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;
}
公共静态biginger modinv(biginger u,biginger v)
{
大整数inv,u1,u3,v1,v3,t1,t3,q;
大整数iter;
/*步骤X1.初始化*/
u1=1;
u3=u;
v1=0;
v3=v;
/*还记得奇偶迭代吗*/
iter=1;
/*步骤X2.在v3!=0时循环*/
while(v3!=0)
{
/*步骤X3.除法和“减法”*/
q=u3/v3;
t3=u3%v3;
t1=u1+q*v1;
/*交换*/
u1=v1;v1=t1;u3=v3;v3=t3;
iter=-iter;
}
/*确保u3=gcd(u,v)==1*/
如果(u3!=1)
返回0;/*错误:不存在反向*/
/*确保取得积极的结果*/
if(iter<0)
inv=v-u1;
其他的
inv=u1;
退货库存;
}
GregS,在我的例子中,只有一个指数是素数。我应该同时使用它作为加密和解密指数吗?换句话说,将相同的数字分配给D和指数?不,加密和解密指数是不同的,尽管当你有两个素数时,一个可以从另一个派生出来。当我在C#中生成RSA密钥时,D
的大小与模数相同(128字节或1024位)。正如您在问题中看到的,我的数据没有D或任何名为加密/解密指数的东西。是否有根据给定数据计算D的实际参考。我能找到的所有示例代码都使用整数模(2字节),这不是我的情况谢谢你的回答。根据你在中的回答,我假设我需要在使用你的方法之前反转p和q。为了完整起见,请您也将其包含在您的答案中好吗?我尝试了D
在一个预生成的密钥上使用您建议的方法进行计算,但没有成功。我把它作为一个不同的问题发布,因为它与这个问题无关。希望你能指出我的错误。这是你的电话号码