2012-04-12 53 views
8

Se me ha proporcionado una cadena cifrada Base64 codificada, que se encriptó en Java utilizando Bouncy Castle. Ejemplo de Java siguiente fragmento:Descifrado de C# RSA usando Bouncy Castle

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic()); 
byte[] encryptedText = cipher.doFinal("xxxxx|xxxxx".getBytes("UTF-8")); 
String encodedText = new BASE64Encoder().encode(encryptedText); 

necesito para descifrar la cadena resultante usando castillo hinchable, pero en C# me ha dado un fragmento de código en la forma de hacer esto en Java, pero no puede convertir esto para C# (razones por las que estamos construyendo un sitio .net, y va a ser un iFrame dentro de un sitio Java. El sitio Java pasará la cadena RSA Encrypted al sitio .NET). Ejemplo de Java de código para descifrar a continuación:

Cipher cipherDec = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipherDec.init(Cipher.DECRYPT_MODE, key.getPrivate()); 
byte[] decodedText = new BASE64Decoder().decodeBuffer(encodedText); 
byte[] decryptedText = cipherDec.doFinal(decodedText); 
String finalValue = new String(decryptedText, "UTF-8"); 

he descargado los ejemplos de http://www.bouncycastle.org/csharp/ pero no parece ser un ejemplo de la introducción de un valor de cadena para ser encriptada, y luego que pase por el cifrar/descifrar proceso .

me ha dado valores para módulo, exponente público, expontent privada, primo p, primo q, exponente primo p, exponente q coeficiente de y CRT .

he visto que puedo usar lo siguiente:

IAsymmetricBlockCipher signer = new Pkcs1Encoding(new RsaEngine()); 
signer.Init(true, pubParameters); 

pero no parece el objeto signer tener los mismos métodos que los ejemplos anteriores de Java.

único método que puede utilizar es

ProcessBlock(byte[] inbuf, int inOff, int inLen); 

, pero no puedo ver cómo utilizar esto en mi contexto.

Cualquier ayuda aquí sería muy apreciada.

Respuesta

13

para ayudar a otros, el código final para convertir es el siguiente:

RsaKeyParameters privParameters = new RsaPrivateCrtKeyParameters(mod, pubExp, privExp, p, q, pExp, qExp, crtCoef); 
RsaKeyParameters pubParameters = new RsaKeyParameters(false, mod, pubExp); 
IAsymmetricBlockCipher eng = new Pkcs1Encoding(new RsaEngine()); 
eng.Init(false, privParameters); 
byte[] encdata = System.Convert.FromBase64String("{the enc string}"); 
encdata = eng.ProcessBlock(encdata, 0, encdata.Length); 
string result = Encoding.UTF8.GetString(encdata); 

mod, pubExp, etc, etc son todos los valores BigInteger:

static BigInteger mod = new BigInteger("big int value"); 

se requieren las siguientes directrices: using

using Org.BouncyCastle.Crypto; 
using Org.BouncyCastle.Crypto.Parameters; 
using Org.BouncyCastle.Crypto.Engines; 
using Org.BouncyCastle.Crypto.Encodings; 
using Org.BouncyCastle.Math; 

que se puede obtener del sitio bouncycastle.http://www.bouncycastle.org/csharp/

2

¿Ha intentado convertir la base de 64 cadenas en una matriz de bytes y luego usar el método de bloques de proceso? Puede haber más que eso, pero definitivamente es el primer paso que tomaría.

Aquí hay un ejemplo de cómo hacer esto: http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx

+0

Gracias Spencer, Utilizando System.Convert.FromBase64String funcionó (Lo intenté anoche, y no funcionó, así que supongo que estaba haciendo algo mal). Eso combinado con el uso de Encoding.UTF8.GetString (encdata); para obtener el resultado final. – mp3duck

1

No estoy seguro de entender por qué debe utilizar BouncyCastle. Los siguientes espectáculos de pequeño fragmento de código y RSA ejemplo de cifrado/descifrado utilizando solamente las clases de .NET:

using System; 
using System.Text; 
using System.Security.Cryptography; 

namespace RsaForDotNet 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512); 
      var encrypted_msg = rsa.Encrypt(Encoding.UTF8.GetBytes("Secret Data"), false); 
      var encoded_msg = Convert.ToBase64String(encrypted_msg); 
      Console.WriteLine(encoded_msg); 
      var decoded_msg = Convert.FromBase64String(encoded_msg); 
      var decrypted_msg = Encoding.UTF8.GetString(rsa.Decrypt(decoded_msg, false)); 
      Console.WriteLine(decrypted_msg); 
     } 
    } 
} 
+1

Gracias. Por supuesto, he intentado esto primero, pero las claves privadas de RSA que me han proporcionado no son compatibles. Me han dado BigInteger Values ​​(este es un tipo de datos dentro de bouncycastle). He intentado hacer algunas conversiones (hay un método ToByteArray() fuera de cada objeto de BigInteger), pero parece que no puedo convertir esto en una cadena sin caracteres aleatorios – mp3duck

+0

La pregunta es acerca del cifrado asimétrico. Tu solución es simétrica. – Diego

+0

@Diego: Mi solución usa encriptación asimétrica. –

Cuestiones relacionadas