2014-06-05 51 views
0

在我的Visual C#加密/解密程序中,我试图独立加密和解密 ,而我试图解密先前加密的数据,我得到一段要解密的数据是无效的错误Visual C#独立解密错误:解密数据的长度无效

String filename; 
     String filename2; 

     private void button1_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog ofd = new OpenFileDialog(); 
      if (ofd.ShowDialog() == DialogResult.OK) { 
       filename = ofd.FileName; 
       textBox1.Text = filename; 
       button2.Enabled = true; 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      StreamReader sr = new StreamReader(filename); 
      String toencrypt = sr.ReadToEnd(); 
      sr.Dispose(); 

      MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
      UTF8Encoding utf8 = new UTF8Encoding(); 
      TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider(); 
      tripleDES.Key = md5.ComputeHash(utf8.GetBytes(toencrypt)); 
      tripleDES.Mode = CipherMode.ECB; 
      tripleDES.Padding = PaddingMode.PKCS7; 
      ICryptoTransform trans = tripleDES.CreateEncryptor(); 
      String encrypted = BitConverter.ToString(trans.TransformFinalBlock(utf8.GetBytes(textBox2.Text), 0, utf8.GetBytes(textBox2.Text).Length)); 

      StreamWriter sw = new StreamWriter(filename); 
      sw.Write(encrypted); 
      sw.Dispose(); 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog ofd = new OpenFileDialog(); 
      if (ofd.ShowDialog() == DialogResult.OK) 
      { 
       filename2 = ofd.FileName; 
       textBox3.Text = filename2; 
       button4.Enabled = true; 
      } 
     } 

     private void button4_Click(object sender, EventArgs e) 
     { 
      StreamReader sr = new StreamReader(filename2); 
      String todecrypt = sr.ReadToEnd(); 
      sr.Dispose(); 

      MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
      UTF8Encoding utf8 = new UTF8Encoding(); 
      TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider(); 
      tripleDES.Key = md5.ComputeHash(utf8.GetBytes(textBox4.Text)); 
      tripleDES.Mode = CipherMode.ECB; 
      tripleDES.Padding = PaddingMode.PKCS7; 
      ICryptoTransform trans = tripleDES.CreateDecryptor(); 
      String decrypted = BitConverter.ToString(trans.TransformFinalBlock(utf8.GetBytes(todecrypt), 0, utf8.GetBytes(todecrypt).Length)); 

      StreamWriter sw = new StreamWriter(filename2); 
      sw.Write(decrypted); 
      sw.Dispose(); 
     } 

基本上我想在这里做的就是打开一个txt文件得到里面的数据进行加密(这工作正常),然后解密(是我的错误)时,它给我的错误我不知道该怎么改变,以解决这个问题,因为数据的长度是使用相同的键和填充以及其他一切适用的...

回答

0

首先:

String encrypted = BitConverter.ToString(trans.TransformFinalBlock(utf8.GetBytes(textBox2.Text), 0, utf8.GetBytes(textBox2.Text).Length)); 

字符串“加密”被格式化为

0C-4C-9B-01-00-0D-81-EC-D6-C5-2C-9A-EC-CE-08-95 

但你尝试解密格式化字符串的UTF8字节。那失败了;而且大部分时间都是由于长度不正确。你想使用BitConverter将字符串转换为字节数组 - 不使用Utf8。

除此之外: 1)不使用ECB 2)做使用文件的哈希值作为关键是可疑的使用IV 3)充其量

编辑:格式化

相关问题