【发布时间】:2013-10-25 18:59:12
【问题描述】:
我有以下测试,可以隔离我在使用 System.Security.Cryptograph.RSACryptoServiceProvider 时遇到的问题。问题是 r.Decrypt 抛出异常“密钥不存在”。如果我同时使用 privateKeyXml 进行加密和解密(而不是在解密时使用 publicKeyXml),那么它会按预期工作。当然我不想共享私钥,我需要能够用公钥解密。 有人看到我在这里做错了吗?
[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);
}
【问题讨论】:
-
不要忘记非对称加密的工作原理:您始终使用公钥加密并使用私钥解密。
-
是的,这是一个骗子。谢谢
-
我真正想做的是使用私钥对文档进行签名,以便可以使用公钥验证它的来源。
-
看起来 RSACryptoServiceProvider SignData/CheckData 是我应该使用的。谢谢。
标签: c# exception encryption rsacryptoserviceprovider