Byłem nad artykule na CodeProject A za chwilę, która wyjaśnia, jak do szyfrowania i deszyfrowania przy użyciu dostawcy RSA:publicznego klucza szyfrującego z RSACryptoServiceProvider
Podczas gdy stara wersja z 2009 roku była wadliwa, nowa wersja 2012 (z obsługą System.Numerics.BigInteger) wydaje się bardziej niezawodna. Co w tej wersji brakuje choć jest sposobem szyfrowania z publicznego klucza i odszyfrować pomocą klawisza prywatny.
Próbowałem tego sam, ale odszyfruję. Nie znam dostawcy RSA, więc jestem w ciemności. Trudno znaleźć więcej informacji na temat tego, jak to działa.
Czy ktoś widzi, co jest z tym nie tak? Poniżej szyfrowanie z kluczem publicznym:
// Add 4 byte padding to the data, and convert to BigInteger struct
BigInteger numData = GetBig(AddPadding(data));
RSAParameters rsaParams = rsa.ExportParameters(false);
//BigInteger D = GetBig(rsaParams.D); //only for private key
BigInteger Exponent = GetBig(rsaParams.Exponent);
BigInteger Modulus = GetBig(rsaParams.Modulus);
BigInteger encData = BigInteger.ModPow(numData, Exponent, Modulus);
return encData.ToByteArray();
Czy mogę używać duże „D” od dostawcy, kiedy to zrobić? Prawdopodobnie nie, ponieważ jest to klucz publiczny, który nie ma litery "D".
Następnie odpowiednik (odszyfrowanie za pomocą klucza prywatnego):
BigInteger numEncData = new BigInteger(cipherData);
RSAParameters rsaParams = rsa.ExportParameters(true);
BigInteger D = GetBig(rsaParams.D);
//BigInteger Exponent = GetBig(rsaParams.Exponent);
BigInteger Modulus = GetBig(rsaParams.Modulus);
BigInteger decData = BigInteger.ModPow(numEncData, D, Modulus);
byte[] data = decData.ToByteArray();
byte[] result = new byte[ data.Length - 1 ];
Array.Copy(data, result, result.Length);
result = RemovePadding(result);
Array.Reverse(result);
return result;
muszę "D" lub wykładnik tutaj?
Oczywiście potrzebuję kryptografii do pracy w obie strony prywatno-publicznej publiczno-prywatnej. Każda pomoc jest doceniana!
elementem 'd' nie znajduje się w kluczu publicznym. jest ustawiany tylko przy użyciu klucza prywatnego do odszyfrowania, a zatem twój przykład zawiedzie, chyba że klucz prywatny zostanie rozprowadzony z aplikacją. –
uhm ... może być fakt, że nie można odszyfrować klucza prywatnego, gdy go nie masz ... tak ... co to ma wspólnego z przykładem obliczeniowym, który pokazuje, jak zrobić matematykę za RSA? – DarkSquirrel42
Nieprawidłowo, możesz odszyfrować dane, które zostały zaszyfrowane przy użyciu klucza prywatnego, używając TYLKO klucza publicznego w procesie odszyfrowywania. Twój powyższy przykład wymaga klucza prywatnego, niezależnie od tego, czy odszyfrowujesz przy użyciu publicznego czy prywatnego do odszyfrowania. Proszę spojrzeć na swoją próbkę, a zrozumiesz. Dla wszystkich, potrzebujesz BOTH publicznych i prywatnych, aby każda z metod odszyfrowywania działa, co jest złe. –