问题描述
我盯着这个看了很长时间,感谢 norefer=true"MSDN 文档 我真的不知道发生了什么.基本上,我将 PFX 文件从光盘加载到 X509Certificate2
并尝试使用公钥加密字符串并使用私钥解密.
I am staring at this for quite a while and thanks to the MSDN documentation I cannot really figure out what's going. Basically I am loading a PFX file from the disc into a X509Certificate2
and trying to encrypt a string using the public key and decrypt using the private key.
为什么我感到困惑:当我将引用传递给 RSACryptoServiceProvider
本身时,加密/解密工作:
Why am I puzzled: the encryption/decryption works when I pass the reference to the RSACryptoServiceProvider
itself:
byte[] ed1 = EncryptRSA("foo1", x.PublicKey.Key as RSACryptoServiceProvider);
string foo1 = DecryptRSA(ed1, x.PrivateKey as RSACryptoServiceProvider);
但是如果导出并传递RSAParameter
:
byte[] ed = EncryptRSA("foo", (x.PublicKey.Key as RSACryptoServiceProvider).ExportParameters(false));
string foo = DecryptRSA(ed, (x.PrivateKey as RSACryptoServiceProvider).ExportParameters(true));
...它抛出一个在指定状态下使用的密钥无效".尝试将私钥导出到 RSAParameter
时出现异常.请注意,生成 PFX 的证书被标记为可导出(即我在创建证书时使用了 pe 标志).知道导致异常的原因是什么吗?
...it throws a "Key not valid for use in specified state." exception while trying to export the private key to RSAParameter
. Please note that the cert the PFX is generated from is marked exportable (i.e. I used the pe flag while creating the cert). Any idea what is causing the exception?
static void Main(string[] args)
{
X509Certificate2 x = new X509Certificate2(@"C: empcerts1 est.pfx", "test");
x.FriendlyName = "My test Cert";
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
try
{
store.Add(x);
}
finally
{
store.Close();
}
byte[] ed1 = EncryptRSA("foo1", x.PublicKey.Key as RSACryptoServiceProvider);
string foo1 = DecryptRSA(ed1, x.PrivateKey as RSACryptoServiceProvider);
byte[] ed = EncryptRSA("foo", (x.PublicKey.Key as RSACryptoServiceProvider).ExportParameters(false));
string foo = DecryptRSA(ed, (x.PrivateKey as RSACryptoServiceProvider).ExportParameters(true));
}
private static byte[] EncryptRSA(string data, RSAParameters rsaParameters)
{
UnicodeEncoding bytConvertor = new UnicodeEncoding();
byte[] plainData = bytConvertor.GetBytes(data);
RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider();
publicKey.ImportParameters(rsaParameters);
return publicKey.Encrypt(plainData, true);
}
private static string DecryptRSA(byte[] data, RSAParameters rsaParameters)
{
UnicodeEncoding bytConvertor = new UnicodeEncoding();
RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider();
privateKey.ImportParameters(rsaParameters);
byte[] deData = privateKey.Decrypt(data, true);
return bytConvertor.GetString(deData);
}
private static byte[] EncryptRSA(string data, RSACryptoServiceProvider publicKey)
{
UnicodeEncoding bytConvertor = new UnicodeEncoding();
byte[] plainData = bytConvertor.GetBytes(data);
return publicKey.Encrypt(plainData, true);
}
private static string DecryptRSA(byte[] data, RSACryptoServiceProvider privateKey)
{
UnicodeEncoding bytConvertor = new UnicodeEncoding();
byte[] deData = privateKey.Decrypt(data, true);
return bytConvertor.GetString(deData);
}
只是为了在上面的代码中澄清粗体部分是抛出:string foo = DecryptRSA(ed, (x.PrivateKey as RSACryptoServiceProvider)**.ExportParameters(true)**);
Just to clarify in the code above the bold part is throwing:string foo = DecryptRSA(ed, (x.PrivateKey as RSACryptoServiceProvider)**.ExportParameters(true)**);
推荐答案
我认为问题可能在于密钥未标记为可导出.X509Certificate2
的另一个构造函数采用 X509KeyStorageFlags 枚举.尝试替换该行:
I believe that the issue may be that the key is not marked as exportable. There is another constructor for X509Certificate2
that takes an X509KeyStorageFlags enum. Try replacing the line:
X509Certificate2 x = new X509Certificate2(@"C: empcerts1 est.pfx", "test");
有了这个:
X509Certificate2 x = new X509Certificate2(@"C: empcerts1 est.pfx", "test", X509KeyStorageFlags.Exportable);
这篇关于CryptographicException “密钥在指定状态下无效."在尝试导出 X509 私钥的 RSAParameters 时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!