2012-04-12 40 views
8

Ich habe eine Base64 Encoded verschlüsselte Zeichenfolge, die in Java mit Bouncy Castle verschlüsselt wurde gegeben. Beispiel Java-Snippet unten:C# RSA Entschlüsselung mit 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); 

ich den resultierenden String mit Hüpfburg entschlüsseln muß, aber in C# ich einen Code-Schnipsel, wie angegeben wurde in Java, dies zu tun, aber ich kann das nicht konvertieren für C# (Gründe dafür ist, dass wir eine .net-Site erstellen, die innerhalb einer Java-Site ein iFrame sein wird. Die Java-Site wird die verschlüsselte RSA-Zeichenfolge an die .NET-Site übergeben). Beispiel Java-Code unten zu entschlüsseln:

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"); 

ich die Beispiele von http://www.bouncycastle.org/csharp/ heruntergeladen haben, aber es scheint nicht ein Beispiel für die Eingabe eines String-Wert zu bekommen verschlüsselt und dann wenn die encrypt gehen/Entschlüsselung Prozess .

Ich habe Werte für Modul, öffentlichen Exponenten, , prime P, Primzahl q, prime Exponenten p, prime Exponenten q und crt Koeffizient privaten expontent gegeben .

ich gesehen habe, dass ich die folgenden verwenden:

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

Aber das signer Objekt scheint nicht über die gleichen Methoden wie die Java-Beispiele zu haben.

nur Methode, die ich verwenden kann, ist

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

Aber ich kann nicht sehen, wie dies in meinem Kontext zu verwenden.

Jede Hilfe hier würde am meisten geschätzt werden.

Antwort

13

um anderen zu helfen, die endgültige Code zu konvertieren, wie folgt:

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 sind alle BigInteger-Werte:

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

Die folgenden using Richtlinien erforderlich sind:

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

Welches kann von der Bouncycastle-Site erhalten werden.http://www.bouncycastle.org/csharp/

2

Haben Sie versucht, die Basis-64-Zeichenfolge in ein Byte-Array zu konvertieren und dann die Prozessblock-Methode zu verwenden? Es könnte mehr sein als das, aber es ist definitiv der erste Schritt, den ich machen würde.

Hier ist ein Beispiel dafür, wie dies zu tun: http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx

+0

Dank Spencer, mit System.Convert.FromBase64String funktioniert (Ich versuchte letzte Nacht, und es hat nicht funktioniert, also ich denke, ich habe etwas falsch gemacht). Dies kombiniert mit der Verwendung von Encoding.UTF8.GetString (encdata); um das Endergebnis zu erhalten. – mp3duck

1

Ich bin nicht sicher, ich verstehe, warum Sie BouncyCastle verwenden. Die folgenden kleinen Code-Schnipsel zeigt und RSA-Verschlüsselung/Entschlüsselung Beispiel nur mit .NET-Klassen:

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

Danke. Ich habe das natürlich zuerst versucht, aber die RSA Private Keys, die ich zur Verfügung gestellt habe, sind nicht kompatibel. Sie haben mir BigInteger Werte (dies ist ein Datentyp innerhalb der Bouncycastle) gegeben. Ich habe versucht, ein paar Konvertierungen (es gibt eine ToByteArray() -Methode von jedem BigInteger-Objekt), aber ich kann nicht scheinen dies in eine Zeichenfolge ohne zufällig aussehende Zeichen zu konvertieren – mp3duck

+0

Die Frage ist über asymmetrische Verschlüsselung. Ihre Lösung ist symmetrisch. – Diego

+0

@Diego: Meine Lösung verwenden asymmetrische Verschlüsselung. –

Verwandte Themen