2010-04-23 14 views
8

Szyfruję na JAVA przy użyciu RSA i próbuję odszyfrować za pomocą .NET. Załączam mój kod JAVA i kod .NET w nadziei, że ktoś ma jakieś doświadczenie z tego typu rzeczami.Szyfrowanie Java RSA - Decrypt .NET

kod Java:

byte[] modulusBytes = Base64.decode("xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk="); 
byte[] exponentBytes = Base64.decode("AQAB"); 
BigInteger modulus = new BigInteger(1, modulusBytes); 
BigInteger exponent = new BigInteger(1, exponentBytes); 

RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent); 
KeyFactory fact = KeyFactory.getInstance("RSA"); 
PublicKey pubKey = fact.generatePublic(rsaPubKey); 

Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

byte[] plainBytes = new String("big kitty dancing").getBytes("UTF-8"); 
byte[] cipherData = cipher.doFinal(plainBytes); 
String encryptedString = Base64.encodeBytes(cipherData); 

Od tego kodu Java biorę wyniki encryptedString które stało się:

FoP4 + AAIH6hcabXnrvNG5YUk/nBv9n9HU0CAgZjkIWQIDjbOpSwoPVBFERrZ6641x2QaoJw5yv18XAay + 0WrCaSw4sveRX + hmPm5qeVUPcjoR4slsVZ/hBFJtAHj9tva4hOugWDZa9s3RVJlxkNfE + u + Kt/YKLOi2EYbH05HjeM =

Podjęto próbę odszyfrowania za pomocą następującego kodu .NET

const int PROVIDER_RSA_FULL = 1; 
const string CONTAINER_NAME = "Tracker"; 

CspParameters cspParams; 
cspParams = new CspParameters(PROVIDER_RSA_FULL); 
cspParams.KeyContainerName = CONTAINER_NAME; 
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(cspParams); 
rsa1.FromXmlString("<RSAKeyValue><Modulus>xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk=</Modulus><Exponent>AQAB</Exponent><P>+lXMCEwIN/7+eMpBrq87kQppxu3jJBTwztGTfXNaPUTx+A6uqRwug5oHBbSpYXKNDNCBzVm/0VxB3bo4FJx+ZQ==</P><Q>yasOGaJaE9xlF9T2xRuKeG9ZxCiyjhYaYB/mbtL+SIbtkRLi/AxaU4g2Il/UxhxhSXArKxIzV28zktispPJx1Q==</Q><DP>ueRgQIEFUV+fY979a1RgrVHIPpqEI1URhOMH3Q59oiXCcOumM5njyIHmWQxRAzXnG+7xlKXi1PrnRll0L4oOKQ==</DP><DQ>dfEMNgG1HJhwpxdtmqkYuoakwQvsIRzcIAuIAJh1DoWaupWJGk8/JEstHb1d+t7uJrzrAi2KyT/HscH2diE0YQ==</DQ><InverseQ>YoYF9PF6FiC0YngVeaC/eqt/ea8wMYNN3YO1LuzWpcy2exPRj2U0ZbWMvHXMUb4ea2qmhZGx1QlK4ULAuWKpXQ==</InverseQ><D>g1WAWI4pEK9TA7CA2Yyy/2FzzNiu0uQCuE2TZYRNiomo96KQXpxwqAzZLw+VDXfJMypwDMAVZe/SqzSJnFEtZxjdxaEo3VLcZ1mnbIL0vS7D6iFeYutF9kF231165qGd3k2tgymNMMpY7oYKjS11Y6JqWDU0WE5hjS2X35iG6mE=</D></RSAKeyValue>"); 

string data2Decrypt = "FoP4+AAIH6hcabXnrvNG5YUk/nBv9n9HU0CAgZjkIWQIDjbOpSwoPVBFERrZ6641x2QaoJw5yv18XAay+0WrCaSw4sveRX+hmPm5qeVUPcjoR4slsVZ/hBFJtAHj9tva4hOugWDZa9s3RVJlxkNfE+u+Kt/YKLOi2EYbH05HjeM="; 

byte[] encyrptedBytes = Convert.FromBase64String(data2Decrypt); 

byte[] plain = rsa1.Decrypt(encyrptedBytes, false); 
string decryptedString = System.Text.Encoding.UTF8.GetString(plain); 
+0

oh, a błąd, który otrzymuję, to "złe dane" – badMonkey

+0

Witam @badMonkey, mam pytanie. Skąd masz XML? Nie dostaję tej części, ma wiele parametrów (Q, P, DP, DQ, InverseQ, D). Mój java szyfruje tekst, a programista C#, który jest mną, powinien go odszyfrować. Dał mi moduł i wykładnik, w jaki sposób mogę odszyfrować zaszyfrowany ciąg przy użyciu tylko modułu i wykładnika? –

+0

Nie jestem tak bardzo pewien, który z nich jest jeden, ale jestem prawie pewien, że ten miły film wideo z tego dżentelmena https://youtu.be/oOcTVTpUsPQ wyjaśnia te pytania, które zadałem w poprzednim komentarzu. Powodzenia. –

Odpowiedz

7

Po stronie Java, należy użyć "RSA/ECB/PKCS1Padding" jako nazwy algorytmu. Z prostą nazwą "RSA", Java nie dodaje dopełnienia PKCS#1, którego oczekuje implementacja C#, stąd "złe dane".

Wypełnienie to przekształcenie danych wejściowych (zakodowanego ciągu znaków) na nieco większy ciąg o takiej samej długości niż moduł RSA (tutaj 128 bajtów). Jest to ważne dla bezpieczeństwa i wprowadza pewną losowość (ten sam ciąg wejściowy nie da za każdym razem tego samego zaszyfrowanego ciągu, ale proces deszyfrowania usuwa tę losowość i odzyskuje właściwy ciąg).

+0

Zawsze jawnie definiuj tryb i dopełnienie w Javie, ponieważ nie ma gwarancji, co zostanie użyte, gdy tego nie zrobisz. Czy C#/.NET ma jakiś odpowiednik? – laz

+0

Thomas Mam nadzieję, że zawsze jesteś w pobliżu, gdy mam problemy z szyfrowaniem! To całkowicie naprawiło problem. laz - RSACryptoServiceProvider.KeyExchangeAlgorithm to ustawiona właściwość. Domyślnie (jak zauważył Thomas Pornin) jest "RSA-PKCS1-KeyEx". – badMonkey

+0

Nie. Jeśli podasz Cipher.getInstance ("RSA"), otrzymasz "RSA/ECB/PKCS1Padding". –

Powiązane problemy