Отображение параметров шифрования RSA из CRT (китайская теорема остатка) to.NET формат

мне нужно реализовать шифрование/дешифрование RSA с помощью C#

у меня есть закрытый ключ со следующими параметрами:

mod n, exponent, p, q, dP, dQ и (p-1mod q)

вышеуказанные параметры объясняются в китайский алгоритм остатка

однако C#.NET реализация RSA имеет различный набор параметров следующим образом:

Modulus, Exponent, P, Q, DP, DQ, D, InverseQ

когда я пытаюсь сопоставить данные из CRT to DOTNET, я получаю ошибку Bad Data

на p,q, dP и dQ отображение очевидно, но об остальных параметрах я не уверен.

было бы здорово, если бы я мог получить помощь в отображении этих параметров

3 ответов


mod n карты Modulus, p-1mod q карты InverseQ шифрование экспоненты карты Exponent и показатель расшифровки сопоставляется с D.

показатель шифрования e и расшифровки показателя d связаны e * d = 1 mod(p-1) (q-1). Таким образом, если у вас есть один из них, вы можете легко получить другой, используя несколько методов из системы.Численные данные.Класс типа 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, особенно если вы привыкли к классу BigInteger Java. См.этот вопрос для получения дополнительной информации.

EDIT:

как CodeInChaos указывает, что последняя строка неверна!

неправильно! Неправильно! Неправильно!

мне стыдно. В поклоне силам зла класс BigInteger не имеет ни модульного обратного метода, ни расширенного метода евклидова алгоритма. Тем не менее, вы можете google для ' C # extended евклидов алгоритм " вы можете найти много реализаций. Расширенный евклидов алгоритм даст вам целые числа 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);