2013-01-07 7 views
6

muszę wdrożyć RSA szyfrowania/deszyfrowania przy użyciu C#Mapowanie szyfrowanie RSA Parametry z CRT (Chińskie twierdzenie reszta) do formatu .NET

Mam klucz prywatny z następującymi parametrami:

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

Powyższe parametry są wytłumaczyć ed w Chinese remainder algorithm

Jednakże C# .NET realizacji RSA ma inny zestaw parametrów, jak następuje:

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

Kiedy próbuję do odwzorowania danych z CRT na DOTNET, pojawia się błąd Bad Data

Dla p, q, dP i dQ mapowanie jest oczywiste, ale o pozostałych parametrach nie jestem pewien.

Byłoby wspaniale, jeśli mogę uzyskać pomoc mapowanie tych paramters

Odpowiedz

5

mod n mapy do Modulus, p-1mod q mapy do InverseQ, mapy szyfrowanie wykładnik do Exponent i mapy wykładnik deszyfrowania do D.

Wykładnik szyfrowania e i wykładnik deszyfrujący d są powiązane przez e * d = 1 mod (p-1) (q-1). Zatem jeśli masz jeden, możesz łatwo wyprowadzić inne, używając kilku metod z klasy 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); 

Zauważ, że należy zachować ostrożność przy konstruowaniu .NET BigInteger, zwłaszcza jeśli są używane do klasy Java BigInteger. Aby uzyskać więcej informacji, patrz this question.

EDIT:

Jak CodeInChaos zwraca uwagę, że ostatnia linia jest błędne!

ŹLE! ŹLE! ŹLE!

Jestem zawstydzony. W łuk sił Zła klasa BigInteger nie ma modułowej metody odwrotnej ani rozszerzonej metody algorytmu euklidesowego. Możesz mimo to google dla "rozszerzonego algorytmu euklidesowego C#" można znaleźć wiele implementacji. Rozszerzony algorytm euklidesowy da ci liczby całkowite x i y takie, że 1 = e * x + phi * y. x jest odwrotnością e mod phi, więc potrzebne jest ustawienie D = x mod phi.

+0

GregS, W moim przypadku mam tylko jeden wykładnik, który jest liczbą pierwszą. powinienem użyć go jako wykładników szyfrujących i deszyfrujących? Innymi słowy, przypisz ten sam numer zarówno do D, jak i do wykładnika? – AaA

+0

Nie, szyfruj i odszyfruj wykładniki są różne, chociaż można je wyprowadzić z innych, jeśli masz obie liczby pierwsze. –

+0

Kiedy generuję klucz RSA w języku C#, 'D' ma taki sam rozmiar jak moduł (128 bajtów lub 1024bity). Jak widzisz, moje dane nie zawierają D ani nic takiego o nazwie Potęgowanie Szyfrowania/Odszyfrowywania. Czy istnieje praktyczne odniesienie do obliczenia D z danych? Wszystkie przykładowe kody, które mogłem znaleźć, zawierają liczbę całkowitą Modulus (2 bajty), co nie jest moim przypadkiem. – AaA

0

D można obliczyć następująco:

var qq = BigInteger.Multiply(phi, n); 
    var qw = BigInteger.Multiply(phi, qq); 
    BigInteger D = BigInteger.ModPow(e, (qw - 1), phi); 
1

Rozszerzony algorytm Euklidesa mogą być wykorzystane do obliczenia modułową odwrotności, w tym przypadku D zostanie obliczona, użyj tego linku: http://www.di-mgt.com.au/euclidean.html#extendedeuclidean uzyskać szczegół, I przetestowałem kod źródłowy w C# jak poniżej, a wynikiem jest dopasowanie,

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; 
} 
Powiązane problemy