读取字节数组与将字节数组写入文件
不一致,所以我的问题很简单。我想加密一些文本,并将其写入文件,如数组的字节,并且比我需要读取文件的内容,并获取像参数到另一个方法解密数组字节的字符串。 方法加密和解密工作正常我尝试它,但是当我从FILE中使用字节数组时它抛出异常。读取字节数组与将字节数组写入文件
private static byte[] EncryptString(string text,byte[] key,byte[] vektor)
{
byte[] array=null;
// Check arguments.
if (text == null || text.Length <= 0)
throw new ArgumentNullException("plainText");
if (key == null || key.Length <= 0)
throw new ArgumentNullException("Key");
if (vektor == null || vektor.Length <= 0)
throw new ArgumentNullException("Vektor");
try
{
using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
{
provider.Key = key;
provider.IV = vektor;
using (MemoryStream memory = new MemoryStream())
{
using (CryptoStream crypto = new CryptoStream(memory, provider.CreateEncryptor(provider.Key, provider.IV), CryptoStreamMode.Write))
{
using (StreamWriter writer = new StreamWriter(crypto))
{
writer.WriteLine(text);
}
}
array = memory.ToArray();
}
}
}
catch (ArgumentNullException e)
{
Console.WriteLine("Error in EncryptString {0}", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Error in EncryptString {0}", e.Message);
}
return array;
}
这种方法Ecnrypt字节数组字符串
private static string DecryptByte(byte[] text, byte[] key, byte[] vektor)
{
string result = null;
// Check arguments.
if (text == null || text.Length <= 0)
throw new ArgumentNullException("plainText");
if (key == null || key.Length <= 0)
throw new ArgumentNullException("Key");
if (vektor == null || vektor.Length <= 0)
throw new ArgumentNullException("Key");
try
{
using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
{
provider.Key=key;
provider.IV=vektor;
using (MemoryStream memory = new MemoryStream(text))
{
using (CryptoStream crypto = new CryptoStream(memory, provider.CreateDecryptor(provider.Key, provider.IV), CryptoStreamMode.Read))
{
using (StreamReader read = new StreamReader(crypto))
{
result=read.ReadToEnd();
}
}
}
}
}
catch(Exception e)
{
Console.WriteLine("Error in DecryptByte:{0}"+e.Message);
}
return result;
}
嗯,我保存加密的文本,然后当按钮被按下
private void buttonDecrypt_Click(object sender, RoutedEventArgs e)
{
byte[] text=null,helper=null;
string result = null;
try
{
using (FileStream filestream = File.OpenRead(path))
{
helper = new byte[filestream.Length];
filestream.Read(helper, 0, (int)filestream.Length);
}
using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
{
result = DecryptByte(helper, provider.Key, provider.IV);
}
}
catch(Exception ex)
{
Console.WriteLine("Error v ButtonDecrypt.{0}_____{1}",ex.Message,ex.Data);
}
}
所以我的问题是,这是我从读取数据文件是不一样的,并在DecryptByte引发异常。你可以帮帮我吗? 编辑是啊异常消息是无效的数据
您的buttonDecrypt_Click中的代码不初始化您的Decryptor的密钥和IV属性。
我怀疑这是你例外的原因。
此外,我认为你有加密和解密方法的另一个问题。 DESCryptoServiceProvider是一个SymmetricAlgorithm的包装。这意味着它以相同大小的块加密字节。所以输入数据需要是块大小的精确倍数。这不会一直发生。然后需要使用padding。
provider.Padding = PaddingMode.PKCS7;
将确保加密字节的正确块大小(也需要在过程的解密)
属性不需要初始化。 MEthods在这段代码中工作正常。使用(DESCryptoServiceProvider prov = new DESCryptoServiceProvider()) byte = EncryptString(textik,prov.Key,prov.IV); text = DecryptByte(bajt,prov.Key,prov.IV); }'文本与之前的加密相同。所以我气的错误是当我写或从文件读取数据的地方。 – 2012-03-23 18:09:56
我试图复制异常,当然,我得到了同样的异常。但问题是我使用了两个不同的DESCriptoServiceProvider实例。这两个istances包含不同的Key和IV值。因此,如果你使用相同的实例加密然后解密,(如你之前的评论),你不会得到任何异常,但是如果你创建两个不同的DESCryptoServiceProvider(可能在两个不同的button_click事件中),你将无法解密该文件用第一个实例加密。 – Steve 2012-03-23 19:51:48
哦,我的上帝,这么愚蠢的错误,我试着解决这个问题2天。非常感谢你,我想我重新编写方法。 – 2012-03-23 20:51:17
有什么异常(精确),以及哪一行代码是把它扔?此外,你的代码有点混乱 - 你应该真正将你的读/写代码从他们自己的方法中提取出来,与GUI分开。重构代码以更好地分离责任将有助于您尝试调试这类问题。 – tomfanning 2012-03-22 22:30:29
你能告诉我们什么例外说? – 2012-03-22 22:34:18
我敢打赌!填充无效,无法删除! – Steve 2012-03-22 22:39:10