引发“密钥不存在”异常.我做错了什么
本文关键字:错了 什么 异常 密钥 不存在 密钥不存在 引发 | 更新日期: 2023-09-27 18:36:52
我有以下测试,它隔离了我在使用System.Security.Cryptograph.RSACryptoServiceProvider时遇到的问题。 问题是 r.Decrypt 抛出异常"密钥不存在"。 如果我同时使用私钥Xml进行加密和解密(而不是在解密时使用公钥Xml),那么它就会按预期工作。 当然我不想共享私钥,我需要能够使用公钥解密。 有人看到我在这里做错了什么吗?
[Fact]
public void BasicEncryptDecrypt()
{
var cspParameters = new CspParameters() { Flags = CspProviderFlags.CreateEphemeralKey | CspProviderFlags.NoPrompt };
string privateKeyXml = null;
string publicKeyXml = null;
using(var r = new RSACryptoServiceProvider(2048, cspParameters)){
r.PersistKeyInCsp = false;
privateKeyXml = r.ToXmlString(true);
publicKeyXml = r.ToXmlString(false);
}
byte[] encrypted = null;
string decrypted = null;
using (var r = new RSACryptoServiceProvider(2048, cspParameters))
{
r.FromXmlString(privateKeyXml);
encrypted = r.Encrypt(Encoding.UTF8.GetBytes("foobar"), false);
}
using (var r = new RSACryptoServiceProvider(2048, cspParameters))
{
r.FromXmlString(publicKeyXml);
decrypted = Encoding.UTF8.GetString(r.Decrypt(encrypted, false));
}
Assert.Equal("foobar", decrypted);
}
您正在使用"私钥加密/公钥解密"。我正在一个项目中工作,我们需要做一个特定的环境。我知道有很多关于这个问题的讨论,但我将继续解释如何做到这一点。我认为有很多问题可以解释我们何时应该使用"签名/验证"或"公钥加密/私钥解密"。
首先,我也得到了与您相同的解决方案,但它不起作用,我测试了很多 CspParameters 选项。我认为它应该有效,但它没有!
所以,我的最终解决方案是使用 BouncyCastle 库:
RsaPrivateCrtKeyParameters privateKeyParameters = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(prvKey));
AsymmetricKeyParameter publicKeyInfoParameters = PublicKeyFactory.CreateKey(Convert.FromBase64String(pubKey));
byte[] clearData = Encoding.UTF8.GetBytes("...");
string algorithm = "RSA/ECB/PKCS1Padding";
var cipherOne = Org.BouncyCastle.Security.CipherUtilities.GetCipher(algorithm);
cipherOne.Init(true, privateKeyParameters);
byte[] signedData = cipherOne.DoFinal(clearData);
var clientTwo = CipherUtilities.GetCipher(algorithm);
clientTwo.Init(false, publicKeyInfoParameters);
var clearDataTwo = clientTwo.DoFinal(signedData);
Assert.IsTrue(Convert.ToBase64String(clearData) == Convert.ToBase64String(clearDataTwo));