6

C#を使用してRSA暗号化/復号化を実装する必要があります

次のパラメータを持つ秘密鍵があります。

mod n、、、、、、、およびexponent_ p_ q_ dP_dQ(p-1mod q)

上記のパラメータは、中国の剰余アルゴリズムで説明されています

ただし、RSAのC#.NET実装には、次のように異なるパラメーターセットがあります。

Modulus、、、、、、、、、Exponent_ P_ Q_ DP_ DQ_ D_InverseQ

CRTデータをからにマップしようとするとDOTNET、エラーが発生しますBad Data

、、 の場合p、マッピングは明らかですが、残りのパラメーターについてはわかりません。qdPdQ

これらのパラメータのマッピングについてサポートを得ることができれば素晴らしいと思います

4

3 に答える 3

6

mod nにマップしModulus、にマップし、暗号化指数はにマップし、復号化指数はにマップします。p-1mod qInverseQExponentD

暗号化指数eと復号化指数dは、e * d = 1 mod(p-1)(q-1)によって関連付けられます。したがって、それらが1つある場合は、System.Numerics.BigIntegerクラスからいくつかのメソッドを使用してもう1つを簡単に派生させることができます。

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);

特にJavaのBigIntegerクラスに慣れている場合は、.NETBigIntegerを作成するときに注意が必要です。詳細については、この質問を参照してください。

編集 :

CodeInChaosが指摘しているように、最後の行は間違っています。

間違い!間違い!間違い!

恥ずかしいです。悪の勢力に屈するために、BigIntegerクラスにはモジュラ逆数法も拡張ユークリッドアルゴリズム法もありません。それでも、「c#拡張ユークリッドアルゴリズム」をグーグルで検索すると、多くの実装を見つけることができます。拡張ユークリッドアルゴリズムは、1 = e * x + phi*yとなる整数xとyを提供します。xはemodphiの逆であるため、D = xmodphiを設定する必要があります。

于 2013-01-07T12:10:37.827 に答える
2

拡張ユークリッドアルゴリズムを使用してモジュラ逆数を計算できます。この場合、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;
}
于 2016-07-05T08:33:20.050 に答える
0

Dは次のように計算できます。

    var qq = BigInteger.Multiply(phi, n);
    var qw = BigInteger.Multiply(phi, qq);
    BigInteger D = BigInteger.ModPow(e, (qw - 1), phi);
于 2014-05-31T10:58:05.810 に答える