我有两台服务器Windows 2008 R2,Server 1&服务器2.我使用以下命令在Windows帐户1下的服务器1上生成了RSA密钥对:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pc "MyKeys" -exp
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -px "MyKeys" keys.xml -pri
我将keys.xml复制到Server 2.在Windows帐户2下的服务器2上,我运行了:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -pi "MyKeys" keys.xml
我使用以下c#代码加密和解密:
private static RSACryptoServiceProvider CreateRsaCypher(string containerName)
{
// Create the CspParameters object and set the key container
// name used to store the RSA key pair.
CspParameters cp = new CspParameters();
cp.KeyContainerName = containerName;
// Create a new instance of RSACryptoServiceProvider that accesses
// the key container MyKeyContainerName.
return new RSACryptoServiceProvider(cp);
}
public static string AsymmetricEncrypt(byte[] data, string containerName)
{
RSACryptoServiceProvider cipher = CreateRsaCypher(containerName);
byte[] cipherText = cipher.Encrypt(data, false);
return Convert.ToBase64String(cipherText);
}
public static string AsymmetricEncrypt(string str, string containerName )
{
return AsymmetricEncrypt(Encoding.UTF8.GetBytes(str), containerName);
}
public static byte[] AsymmetricDecrypt(string data, string containerName)
{
RSACryptoServiceProvider cipher = CreateRsaCypher(containerName);
return cipher.Decrypt(Convert.FromBase64String(data), false);
}
public static string AsymmetricDecryptToString(string data, string containerName)
{
return Encoding.UTF8.GetString(AsymmetricDecrypt(data, containerName));
}
现在,当我使用帐户1下的同一容器加密服务器1上的字符串时,如果我尝试在帐户2下的服务器2上解密它,我会得到:
Unhandled Exception: System.Security.Cryptography.CryptographicException: Bad Data.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte[] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey)
at System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP)
我加密/解密的应用程序是一个C#控制台应用程序。
我注意到Server 1&服务器2没有相同版本的aspnet_regiis.exe,一个是:
Microsoft (R) ASP.NET RegIIS version 4.0.30319.0
另一个是:
Microsoft (R) ASP.NET RegIIS version 4.0.30319.18408
我是否期望能够使用服务器2上的相同密钥(即在服务器1上导出并在服务器2上导入的密钥对)解密服务器1上加密的文本?窗口是否会在导入时以某种方式改变公钥/私钥?
提前谢谢!
只是一个更新。基于其他测试,我注意到在不同的Windows帐户下使用相同的RSA容器加密相同的字符串会导致不同的加密字符串,这在某种程度上是有意义的。这解释了我看到的行为。
答案 0 :(得分:0)
private static RSACryptoServiceProvider CreateRsaCypher(string containerName = DefaultContainerName)
{
// Create the CspParameters object and set the key container
// name used to store the RSA key pair.
CspParameters cp = new CspParameters();
cp.KeyContainerName = containerName;
cp.Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore;
// Create a new instance of RSACryptoServiceProvider that accesses
// the key container MyKeyContainerName.
return new RSACryptoServiceProvider(cp);
}