我正在尝试在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);
答案 0 :(得分:0)
为什么你要用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
答案 1 :(得分:0)
您必须使用new PKCS1Encoding(cipher2)
。 RSAEngine
仅生成普通(也称为原始或教科书)RSA。
答案 2 :(得分:0)
我的建议是使其尽可能简单,而不要为此使用Bouncy Castle。您需要创建用于加密的公钥,用于解密的私钥以及用于从中获取私钥的证书。
首先,使用OpenSSL创建私钥和证书PEM文件:
set.seed(354)
df <- data.frame(Product_Id = rep(1:10, each = 50),
Date = seq(from = as.Date("2010/1/1"), to = as.Date("2014/2/1") , by = "month"),
Sales = rnorm(100, mean = 50, sd= 20))
df <- df[-c(251:256, 301:312) ,]
然后从您创建的证书中创建一个公钥PEM文件:
openssl req -newkey rsa:1024 -nodes -keyout private_key.pem -x509 -days 365 -out certificate.pem
然后使用您创建的私钥和证书PEM文件导出PFX文件:
openssl x509 -pubkey -noout -in certificate.pem > public_key.pem
导出时,将要求您提供证书密码。
现在是在C#中执行RSA解密的方法:
openssl pkcs12 -export -out certificate.pfx -inkey private_key.pem -in certificate.pem
答案 3 :(得分:-1)
告诉我它是否适合你。
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 + input.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());
}