Шифрование в JavaScript не будет расшифровываться в С#

Я пытаюсь использовать RSA-шифрование в JavaScript, а затем расшифровать его на С#. В JavaScript я использую библиотеку jsencrypt. В С# я использую API "Bouncy Castle". Когда я делаю шифрование/дешифрование на одном языке, все работает. Я возвращаю правильный текст, когда я его расшифровываю. Когда я пытаюсь расшифровать на С# то, что было зашифровано в JavaScript, я не получаю ничего близкого. Я уверен, что ключи между ними совпадают. Ниже приведен пример кода. Любая помощь в том, как решить эту проблему, будет весьма признательна.

JavaScript

//using jsencrypt.min.js

var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val());
var encrypted = encrypt.encrypt($('#input').val());

возьмите значение, которое я получаю из JavaScript "зашифровано" и использую его в С# для "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.*********();
 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);
3 ответа

Зачем вам хотеть пытать себя, используя BC?

Самый простой способ расшифровки:

// store is a X509Store pointing to the correct store on the target machine
 // You have to ensure that the security principal for your app has access to the private key to decrypt
 X509Certificate2 cert = store.Certificates.Find(X509FindType.FindByThumbprint, "sha1hash", false)[0];

 var prov = (RSACryptoServiceProvider)cert.PrivateKey;
 var decipheredText = Encoding.UTF8.GetString(prov.Decrypt(Convert.FromBase64String(target), false));

Очевидно, вы можете получить свой X509Certificate2 из файла или любые другие средства, например X509Certificate2 cert = new X509Certificate2(@"C:\someCert.pfx", "somePass");

Если вы следовали учебному курсу jsencrypt, используйте эту команду openssl, чтобы получить pfx из имеющихся у вас папок:

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.pem -in publicKey.pem


Вам нужно будет использовать new PKCS1Encoding(cipher2). ********* производит только простой (также известный как raw или учебник) RSA.


Скажите, если это сработает для вас.

public string Decrypt(RSACryptoServiceProvider provider, string toDecrypt)
{
 var input = Convert.FromBase64String(toDecrypt);
 IEnumerable<byte> output = new List<byte>();
 for (var i = 0; i < input.Length; i = i + Length)
 {
 var length = Math.Max(input.Length - i, 128);
 var block = new byte[length];
 Buffer.BlockCopy(input, i, block, 0, length);
 var chunk = provider.Decrypt(block, false);
 output = output.Concat(chunk);
 }
 return Encoding.UTF8.GetString(output.ToArray());
}
</byte></byte>

licensed under cc by-sa 3.0 with attribution.