意外的CryptographicException:Keyset不存在和CryptographicException:访问被拒绝

时间:2011-01-28 18:18:32

标签: c# .net security encryption installer

我们正试图在我们的XP SP2计算机(稍后是Win7)上为我们的C#(。net 3.5)应用程序执行此操作。

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

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

解密连接字符串

安装程序和我们的应用程序共享constant string container name的{​​{1}}。

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

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

  1. 安装程序可以删除我们的应用程序创建的存储的MachineKeyStore,并使用相同的容器名称立即创建一个新的; {/ li>
  2. 安装程序可以更新由我们的应用程序创建的key-pair(不是删除并再次创建,它会被覆盖,我认为 - 但这不应该根据文档发生)
  3. 我们的应用程序无法删除安装程序创建的密钥对:当密钥对实际存在时会发生key-pair异常;
  4. 当安装程序创建的密钥对存在时,我们的应用程序无法创建新应用程序:CryptographicException: Keyset does not exist.
  5. 我们的应用程序无法访问安装程序创建的密钥对, 在这种情况下会发生CryptographicException: Keyset does not exist.。安装程序中的加密适用于CryptographicException: Access is denied.AES。当应用程序尝试使用存储的RSA public key进行解密时,将发生“private key”异常。
  6. 我们的代码如下:

    Access is denied

    访问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

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

    修改

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

1 个答案:

答案 0 :(得分:2)

实际问题不是很清楚。但是,我在您的代码中看到了一些内容:

  • 您将密钥对(私有和公共)从提供者导出到参数中。人们对布尔参数感到困惑。 IT并不意味着它只导出私钥。如果将其设置为true(导出私钥),则将导出PUBLIC和PRIVATE键。
  • 从RSA Provider实例导出的相同密钥,您将导回到同一个提供程序中。这没有任何意义。
  • 删除ExportParameters和ImportParameters行,它们什么都不做。如果您在构造函数中指定的容器名称有效且存在,则您的密钥应该已经进入RSA Provider。
  • 使用非对称加密技术,您可以使用PRIVATE密钥进行加密,因为您不共享。然后使用PUBLIC密钥进行解密,因为另一方(接收方)应该只保留您的PUBLIC密钥才能解密。如果他们有您的私钥,整个计划都会受到损害。