Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将RSA加密参数从CRT(中国剩余定理)映射到.NET格式_C#_.net_C_Rsa_Chinese Remainder Theorem - Fatal编程技术网

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

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映射

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

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

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
在一个预生成的密钥上使用您建议的方法进行计算,但没有成功。我把它作为一个不同的问题发布,因为它与这个问题无关。希望你能指出我的错误。这是你的电话号码