2015-10-23 50 views
5

Próbuję utworzyć aplikację bazy danych online przy użyciu PHP dla serwera i aplikacji formularza C# dla klienta. Na serwerze zaszyfrowuję prosty ciąg przy użyciu publicznego klucza RSA z PHPSecLib. Następnie aplikacja C# odbiera ciąg znaków i próbuje go odszyfrować, używając odpowiedniego klucza prywatnego. Bajty są kodowane base64 na serwerze i ponownie dekodowane do bajtów przez C#. Stworzyłem parę kluczy za pomocą PHPSecLib.System.IO.IOException: ----- KEY PRYWATNY KOŃCOWEGO RSA nie został znaleziony

Jest to kod używam w aplikacji klienckiej:

public string rsa_decrypt(string encryptedText, string privateKey) { 
     byte[] bytesToDecrypt = Convert.FromBase64String(encryptedText); 
     Pkcs1Encoding decrypter = new Pkcs1Encoding(new RsaEngine()); 
     //the error occurs on this line: 
     AsymmetricCipherKeyPair RSAParams = (AsymmetricCipherKeyPair)new PemReader(new StringReader(privateKey)).ReadObject(); 

     decrypter.Init(false, RSAParams.Private); 
     byte[] decryptedBytes = decrypter.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length); 
     string decryptedString = Convert.ToBase64String(decryptedBytes); 
     return decryptedString; 
    } 

Ale pojawia się następujący błąd na linii określonej powyżej ^.

nieobsługiwany wyjątek typu 'System.IO.IOException' w module BouncyCastle.Crypto.dll

dodatkowe ----- END RSA Klucz prywatny znaleziono

Uważam, że nie ma nic złego w połączeniu z parą kluczy, ponieważ dostaję błąd, zanim spróbuję odszyfrować wszystko. Parametr privateKey obecnie sztywno do skryptu za pomocą tego formatu:

string privateKey = "-----BEGIN RSA PRIVATE KEY-----XXXXXXXX-----END RSA PRIVATE KEY-----"; 

Więc wydaje mi się, że stopka rzeczywiście znajduje się w ciągu ... Mam debugowany google i wszędzie, ale nie wydaje się rozwiązać. Jestem całkiem nowy w RSA & Bouncycastle, więc może używam niewłaściwych metod.

Mam nadzieję, że możesz pomóc, dzięki! - G4A

P.S. To jest moje pierwsze pytanie dotyczące Stackoverflow, właśnie utworzyłem konto, więc jeśli mógłbyś podać mi trochę informacji na temat sposobu, w jaki sformułowałem to pytanie; wspaniały!

+2

IIRC potrzebujesz linii między granicą pre-eb; '" ----- BEGIN KLUCZ PRYWATNY RSA ----- \ r \ nXXXXXXXX \ r \ n ----- KONTO PRYWATNE KOŃCOWEGO KONIEC RSA ----- "' –

+1

Witamy w SO, G4A! Nie ma wiele problemów z pytaniem, dobre pytanie, doskonałe formatowanie. Cztery rzeczy do dalszego ulepszenia: 1) zakończ z rzeczywistym pytaniem (wiesz, czymś, co kończy się znakiem zapytania) 2) "Nadzieja, że ​​możesz pomóc, dzięki! -4GA" nie jest wymagana, a właściwie nie jest preferowana 3) PS powinien być komentarzem poniżej pytania i 4) proszę, spróbuj i humoru nam, odpowiadając na przykład AlexK. kiedy proponuje rozwiązanie (którego nie jest pewien, stąd komentarz zamiast odpowiedzi). –

+1

To zrobiło sztuczkę @AlexK.! Właściwie to już próbowałem, ale zapomniałem powrotu karetki. Czy mógłbyś skasować swój komentarz i zrobić z niego odpowiedź, aby dać ci karmę, czy jakkolwiek to się nazywa. I dziękuję @Maarten Bodewes, że to zapamiętam. I wreszcie, przepraszam za późną odpowiedź; Domyślam się, że mój e-mail nie jest jeszcze poprawnie skonfigurowany. – G4A

Odpowiedz

6

Trzeba dodać nową linię między pre/post hermetyzacji tekstu granicznej oraz dane Base64, więc:

string privateKey = "-----BEGIN RSA PRIVATE KEY-----\r\nXXX\r\n-----END RSA PRIVATE KEY-----"; 

To dlatego, że specyfikacja PEM pozwala na istnienie innych nagłówków tekstowych pomiędzy dwoma .

+1

Wskazówka Pro - upewnij się, że nie używasz dosłownego ciągu literowego ('@" ... "'), który zignorowałby sekwencje specjalne "\ n" i "\ r". –