I am trying to use RSA encryption in JavaScript and then decrypt it in C#. In JavaScript I am using the library jsencrypt. In C# I using the API "bouncy castle". When I do the encryption/decryption within the same language everything works. I get back the correct text when I decrypt it. When I try to decrypt in C# what was encrypted in JavaScript I get nothing close. I am sure the keys are the same between the two. An example of the code is below. Any help on how to solve this would be greatly appreciated.
JavaScript
//using jsencrypt.min.js
var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val());
var encrypted = encrypt.encrypt($('#input').val());
take the value I get from JavaScript "encrypted" and use it in C# for "encyp"
AsymmetricCipherKeyPair KeyParameterPrivate;
byte[] cipheredBytes = Convert.FromBase64String(encyp);
string privateKeyFileName = @"C:\private.pem";
using (var fileStream2 = File.OpenText(privateKeyFileName))
{
PemReader pemReader2 = new Org.BouncyCastle.OpenSsl.PemReader(fileStream2);
KeyParameterPrivate = (Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair)pemReader2.ReadObject();
}
IAsymmetricBlockCipher cipher2 = new Org.BouncyCastle.Crypto.Engines.RsaEngine();
RsaKeyParameters privateKey2 = (RsaKeyParameters)KeyParameterPrivate.Private;
//cipher.Init(false, publicKey4);
cipher2.Init(false, privateKey2);
byte[] deciphered = cipher2.ProcessBlock(cipheredBytes, 0, cipheredBytes.Length);
string decipheredText = utf8enc.GetString(deciphered);
You'll have to use
new PKCS1Encoding(cipher2)
. TheRSAEngine
only produces plain (also known as raw or textbook) RSA.My advice is to keep it as simple as possible and not use Bouncy Castle for this. You need to create a public key for encryption, private key for decryption and a certificate to fetch the private key from.
First, create private key and certificate PEM files using OpenSSL:
Then create a public key PEM file from the certificate that you created:
Then export a PFX file using the private key and certificate PEM files that you created:
When you do the export, you'll be asked to provide a certificate password.
Now here is how to do the RSA decryption in C#:
Tell me if it works for you.
Why would you want to torture yourself using BC for this?
The easiest approach to decryption here is :
Obviously you can get your X509Certificate2 from file or any other means, e.g.
X509Certificate2 cert = new X509Certificate2(@"C:\someCert.pfx", "somePass");
If you followed jsencrypt tutorial, use this openssl command to get the pfx out of the pems you have: