C# RSA Decryption using Bouncy Castle

bouncycastle, c#, cryptography, java, rsa

Solution

To Help others, the final code to convert is as follows:

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 are all BigInteger values:

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

The Following `using` directives are required:

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

Which can be obtained from the bouncycastle site. http://www.bouncycastle.org/csharp/

Problem

I have been given a Base64 Encoded encrypted string, which was encrypted in Java using Bouncy Castle. Example Java snippet below: ``` 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); ``` I need to decrypt the resulting string using Bouncy Castle, but in C# I have been given a code snippet on how to do this in Java, but I can't convert this for C# (reasons is we are building a .net site, and is going to be an iFrame within a Java site. The Java site is going to passing in the RSA Encrypted string to the .NET site). Example Java code to decrypt below: ``` 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"); ``` I have downloaded the examples from http://www.bouncycastle.org/csharp/ but there doesn't seem to be an example of inputting a string value to get encrypted, and it then going though the encrypt/decrypt process. I have been given values for modulus, public exponent, private expontent, prime P, prime q, prime exponent p, prime exponent q and crt coefficient. I have seen that I can use the following: ``` IAsymmetricBlockCipher signer = new Pkcs1Encoding(new RsaEngine()); signer.Init(true, pubParameters); ``` But the `signer` object doesn't seem to have the same methods as the Java examples above. Only method I can use is ``` ProcessBlock(byte[] inbuf, int inOff, int inLen); ``` But I can't see how to use this in my context. Any help here would be most appreciated.

Original source