我正在尝试从密钥容器访问私钥,然后使用它来解密先前加密的byte []消息。我的代码似乎能够加密该byte [],但是当我尝试解密它时,我收到以下消息:
未处理的类型' System.ObjectDisposedException'发生在mscorlib.dll
我在Visual Studios中使用C#。 我的主要功能如下:
try
{
string testValue = "TestKeyContainer";
string message = "This is the test message!";
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] originalData = ByteConverter.GetBytes(message);
byte[] encryptedData;
byte[] decryptedData;
RSACryptoServiceProvider rsa = null;
//Create a public-private key pair and store them in a key container.
MakeAndSaveKey(testValue);
//[Attempt to] retrieve the key from the container
rsa = GetKeyFromContainer(testValue);
//Read message
Console.WriteLine("Reading the test message... *ahem*...\n{0}", ByteConverter.GetString(originalData));
//Encrypt, then read message
encryptedData = encrypt(originalData, rsa);
Console.WriteLine("Reading the encrypted message...\n....\n{0}", ByteConverter.GetString(encryptedData));
//Decrypt, then read message
decryptedData = decrypt(encryptedData, rsa);
Console.WriteLine("Reading the decrypted message...\n{0}", ByteConverter.GetString(decryptedData));
//Delete key from the container
//DeleteKey("TestKeyContainer");
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
}
DeleteKey(字符串)未完成,因此被注释掉了。 MakeAndSaveKey(字符串)的代码是:
private static void MakeAndSaveKey(string containerName)
{
CspParameters cp = new CspParameters();
cp.KeyContainerName = containerName;
CspParameters cp = new CspParameters();
cp.KeyContainerName = containerName;
return;
}
GetKeyFromContainer(string)是:
private static RSACryptoServiceProvider GetKeyFromContainer(string containerName)
{
CspParameters cp = new CspParameters();
cp.KeyContainerName = containerName;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
return rsa;
}
应该注意的是,MakeAndSaveKey和GetKeyFromContainer实际上只是来自How to: Store Asymmetric Keys in a Key Container的Microsoft代码的C#翻译。
加密代码(byte [],RSACryptoServiceProvider)是:
private static byte[] encrypt(byte[] message, RSACryptoServiceProvider rsa)
{
using (rsa)
{
message = RSAEncrypt(message, rsa.ExportParameters(false), false);
}
return message;
}
对于decrypt(byte [],RSACryptoServiceProvider):
private static byte[] decrypt(byte[] message, RSACryptoServiceProvider rsa)
{
using (rsa)
{
try
{
message = RSADecrypt(message, rsa.ExportParameters(true), false);
}
catch (CryptographicException e)
{
Console.WriteLine("Couldn't decrypt the message. \n:ERROR: {0}", e.Message);
}
}
return message;
}
程序在停止之前输出以下内容:
阅读测试信息...... ahem ...
这是测试讯息!
阅读加密邮件......
...
??????????????????????????Ù????????????????? =& ???????小号??????? H +
,除了' ='有三条线而不是两条线。我只是不知道在哪里找到那个符号。
之后,我收到了本文顶部描述的异常。具体来说,它指向声明
message = RSADecrypt(message, rsa.ExportParameters(true), false);
来自decrypt(byte [],RSACryptoServiceProvider)定义。有谁知道为什么会这样,或者如何解决它?
答案 0 :(得分:2)
using (resource)
{
// do something
}
是语法糖:
try
{
// do something
}
finally
{
if (resource!= null)
resource.Dispose();
}
所以这意味着decrypt
尝试使用已经处置的对象。
如果您将resource
(s)放在自己的容器中,则表示您自己管理它,并且不应使用using
。删除using
的使用并确保在完成后手动处置所有资源。它应该工作。