2010-04-23 45 views
8

Estoy encriptando en JAVA usando RSA e intentando descifrar usando .NET. Estoy incluyendo mi código JAVA y el código .NET con la esperanza de que alguien tenga alguna experiencia con este tipo de cosas.Java RSA Encrypt - Desencripta .NET

código 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); 

A partir de este código Java que toma los resultados de la encryptedString que resultan ser:

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

e intentar descifrar usando el siguiente código .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, y el error que recibo es "datos erróneos" – badMonkey

+0

Hola @badMonkey, tengo una pregunta. ¿De dónde obtuviste el XML? No entiendo esa parte, tiene muchos parámetros (Q, P, DP, DQ, InverseQ, D). Mi compañero de Java está encriptando un texto, y el desarrollador de C# que soy yo debería descifrarlo. Me dio el módulo y el exponente, ¿cómo puedo descifrar la cadena cifrada usando solo módulo y exponente? –

+0

No estoy muy seguro de cuál es cuál, pero estoy bastante seguro de que este bonito video ilustrativo de este caballero https://youtu.be/oOcTVTpUsPQ explica las preguntas que hice en el comentario anterior. Buena suerte. –

Respuesta

7

En el lado de Java, debe usar "RSA/ECB/PKCS1Padding" como nombre del algoritmo. Con el nombre simple "RSA", Java no agrega el relleno PKCS#1 que espera la implementación de C#, de ahí los "datos incorrectos".

El relleno es una transformación de los datos de entrada (su cadena codificada) en una cadena algo más grande que tiene la misma longitud que el módulo RSA (128 bytes aquí). Es importante para la seguridad e inyecta algo de aleatoriedad (la misma cadena de entrada no arrojará la misma cadena cifrada todo el tiempo, pero el proceso de desencriptación elimina esa aleatoriedad y recupera la cadena correcta, no obstante).

+0

Defina siempre explícitamente el modo y el relleno en Java, ya que no existen garantías sobre lo que se utilizará cuando no lo haga. ¿Me parece que C# /. NET tiene algún equivalente? – laz

+0

Thomas Espero que siempre estés cerca cuando tenga problemas de encriptación. Eso solucionó definitivamente el problema. laz - RSACryptoServiceProvider.KeyExchangeAlgorithm es la propiedad que ha configurado. El valor predeterminado (como señaló Thomas Pornin) es "RSA-PKCS1-KeyEx". – badMonkey

+0

No. Si especifica Cipher.getInstance ("RSA") obtiene "RSA/ECB/PKCS1Padding". –