JavaScript中的加密不会在C#中解密

我试图在JavaScript中使用RSA加密,然后在C#中解密它。 在JavaScript中我使用的是库jsencrypt。 在C#中我使用API​​“充气城堡”。 当我在同一种语言中进行加密/解密时,一切正常。 当我解密它时,我得到了正确的文本。 当我尝试在C#中解密用JavaScript加密的内容时,我什么都没有得到。 我确信两者之间的关键是相同的。 代码示例如下。 任何有关如何解决这个问题的帮助将不胜感激。

JavaScript的

//using jsencrypt.min.js var encrypt = new JSEncrypt(); encrypt.setPublicKey($('#pubkey').val()); var encrypted = encrypt.encrypt($('#input').val()); 

从JavaScript中获取“加密”的值,并在C#中用于“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); 

你为什么要用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命令从您拥有的pems中获取pfx:

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

您将不得不使用new PKCS1Encoding(cipher2)RSAEngine仅生成普通(也称为原始或教科书)RSA。

告诉我它是否适合你。

 public string Decrypt(RSACryptoServiceProvider provider, string toDecrypt) { var input = Convert.FromBase64String(toDecrypt); IEnumerable output = new List(); 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()); }