抛出“密钥不存在”异常。我究竟做错了啥?

Posted

技术标签:

【中文标题】抛出“密钥不存在”异常。我究竟做错了啥?【英文标题】:"Key does not exist" exception thrown. What am I doing wrong?抛出“密钥不存在”异常。我究竟做错了什么? 【发布时间】: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);
    

【问题讨论】:

how to decrypt an encrypted text using RSACryptoServiceProvider?的可能重复 不要忘记非对称加密的工作原理:您始终使用公钥加密并使用私钥解密。 是的,这是一个骗子。谢谢 我真正想做的是使用私钥对文档进行签名,以便可以使用公钥验证它的来源。 看起来 RSACryptoServiceProvider SignData/CheckData 是我应该使用的。谢谢。 【参考方案1】:

您正在使用“私钥加密/公钥解密”。我正在一个项目中工作,我们需要在特定的环境中进行。我知道对此有很多讨论,但我将继续解释如何做到这一点。我认为有很多问题解释了我们何时应该使用“签名/验证”或“公钥加密/私钥解密”。

首先,我也得到了和你一样的解决方案,但是没有用,我测试了很多 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));

【讨论】:

以上是关于抛出“密钥不存在”异常。我究竟做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

DBSCAN 聚类算法无法正常工作。我究竟做错了啥?

尝试将 Firefox 的按钮垂直居中会导致 chrome 中的菜单不均匀。我究竟做错了啥?

Android OS 2.2 权限:我完全不知道为啥这段简单的代码不起作用。我究竟做错了啥?

“多重定义”错误。我究竟做错了啥?

我究竟做错了啥?角垫形式场

我究竟做错了啥? NSFileManager 问题