我们试图在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,用于MachineKeyStore的container name。
我知道密钥对的存储位置,所以我可以监视它以查看密钥对是否被删除、更新或创建。
我做了一些测试,发现了一些有趣的事情(出乎意料),但不知道为什么会这样。我的用户帐户是管理帐户。
key-pair,并立即用相同的容器名创建一个新的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以进行解密的代码:
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加密)工作得很好。
发布于 2011-05-23 02:53:16
实际问题并不十分清楚。但是,我在代码中看到了一些东西:
https://stackoverflow.com/questions/4831634
复制相似问题