我们正试图在我们的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}}。
我知道密钥对的存储位置,因此我可以监控它以查看密钥对是否被删除,更新或创建。
我做了一些测试,发现了一些有趣的事情(意外),但不知道为什么会这样。我的用户帐户是管理员帐户。
MachineKeyStore
,并使用相同的容器名称立即创建一个新的; {/ li>
key-pair
(不是删除并再次创建,它会被覆盖,我认为 - 但这不应该根据文档发生)key-pair
异常; CryptographicException: Keyset does not exist.
CryptographicException: Keyset does not exist.
。安装程序中的加密适用于CryptographicException: Access is denied.
和AES
。当应用程序尝试使用存储的RSA public key
进行解密时,将发生“private key
”异常。我们的代码如下:
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加密)(不涉及安装程序)可以正常工作。
答案 0 :(得分:2)
实际问题不是很清楚。但是,我在您的代码中看到了一些内容: