首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >意外的CryptographicException: Keyset不存在,CryptographicException: Access被拒绝

意外的CryptographicException: Keyset不存在,CryptographicException: Access被拒绝
EN

Stack Overflow用户
提问于 2011-01-28 18:18:32
回答 1查看 3.9K关注 0票数 1

我们试图在XP C# (.net 3.5)应用程序上使用XP SP2计算机(稍后的Win7)来实现这一点。

在我们的安装程序(由VS2008创建)中,我们用AES密钥和iv加密连接字符串,然后创建RSA key-pair并将它们存储在MachineKeyStore中。安装程序将使用RSA public key加密AES密钥和iv,并使用加密的连接字符串存储加密的密钥和iv。

安装后,我们的应用程序将读取带有加密的AES密钥的加密连接字符串并返回iv,并使用RSA private key (来自MachineKeyStore)解密AES密钥和iv,然后用AES密钥和iv解密连接字符串。

安装程序和我们的应用程序共享一个constant string,用于MachineKeyStorecontainer name

我知道密钥对的存储位置,所以我可以监视它以查看密钥对是否被删除、更新或创建。

我做了一些测试,发现了一些有趣的事情(出乎意料),但不知道为什么会这样。我的用户帐户是管理帐户。

  1. 安装程序可以删除我们的应用程序创建的存储的key-pair,并立即用相同的容器名创建一个新的key-pair
  2. 安装程序可以更新我们的应用程序创建的key-pair (不是删除和再次创建,而是重写)
  3. 我们的应用程序不能删除安装程序创建的密钥对:当密钥对实际存在时会发生CryptographicException: Keyset does not exist.异常;当安装程序创建的密钥对存在时,我们的应用程序无法创建新的密钥对:CryptographicException: Keyset does not exist.
  4. Our应用程序无法访问安装程序创建的密钥对,在这种情况下将发生CryptographicException: Access is denied.。安装程序中的加密适用于AESRSA public key。当应用程序尝试使用存储的private key进行解密时,将出现"Access is denied“异常。

我们的守则如下:

代码语言:javascript
复制
public static void CreateRSAKeyPair(string keyContainerName)
        {
            DeleteRSAKeyPair(keyContainerName);

            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = keyContainerName;
            cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;

            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams))
            {
                rsa.PersistKeyInCsp = false;
            }
        }



public static void DeleteRSAKeyPair(string keyContainerName)
        {
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = keyContainerName;
            cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;

            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams))
            {
                rsa.PersistKeyInCsp = false;
                try
                {
                    rsa.Clear();
                }
                catch (CryptographicException ex)
                {
                    Log.logItem(LogType.Exception, "RSA key clear error, can be ignored", "SecurityMgr::DeleteRSAKeyPair()", "CryptographicException msg=" + ex.ToString());
                }
            }
        }

访问private key以进行解密的代码:

代码语言:javascript
复制
private static byte[] RSADecrypt(byte[] inputData, string keyContainerName)
        {
            byte[] resultData = null;
            try
            {
                CspParameters cspParams = new CspParameters();
                cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;
                cspParams.KeyContainerName = keyContainerName;
                using (RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams))
                {
                    //rsaProvider.PersistKeyInCsp = true;
                    //private key
                    RSAParameters rsaParams = rsaProvider.ExportParameters(true);
                    rsaProvider.ImportParameters(rsaParams);
                    resultData = rsaProvider.Decrypt(inputData, false);
                }
            }
            catch (CryptographicException ex)
            {
                string msg = "CryptographicException: keyContainerName=" + keyContainerName + "\nmsg=" + ex.ToString();
                Log.logItem(LogType.Exception, "RSA decryption exception", "SecurityMgr::RSADecrypt()", msg);
            }
            return resultData;
        }

RSA不对称加密可以这样使用吗?

编辑:

对于我们的应用程序中的连接字符串(不涉及安装程序)执行相同的操作(使用AES和RSA加密)工作得很好。

EN

回答 1

Stack Overflow用户

发布于 2011-05-23 02:53:16

实际问题并不十分清楚。但是,我在代码中看到了一些东西:

  • 您将密钥对(私有和公共)从提供程序导出到参数中。人们对布尔参数感到困惑。这并不意味着它只导出私钥。如果您将其设置为true (导出私钥),则您的公钥和私钥都将被导出。
  • 与您从RSA提供程序实例导出的密钥相同,您将导入回同一个提供程序。这没有任何意义,
  • 删除了ExportParameters和ImportParameters行,就什么也没做了。如果您在构造函数中指定的容器名称是有效且存在的,您的密钥应该已经进入RSA提供程序。使用非对称加密的
  • 您使用私钥加密,因为您不共享私钥。然后使用公钥解密,因为对方(接收方)只能持有您的公钥才能解密。如果他们拥有你的私钥,整个计划就会被破坏。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4831634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档