2011-05-19 105 views
-4
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Threading; 
using System.Net; 
using System.Net.Sockets; 
using System.Security.Cryptography; 

namespace GUISimpleTCPClient 
{ 

    public partial class GUISimpleTCPClient : Form 
    { 

     TcpClient client=null; 
     NetworkStream stream; 
     StreamReader reader; 
     StreamWriter writer; 
     public GUISimpleTCPClient() 
     { 
      InitializeComponent(); 
     } 

     private void Connect_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       client=new TcpClient(ipAddress.Text,Convert.ToInt32(port.Text)); 
       listBox1.Items.Add("Connected to Server"); 
       stream = client.GetStream(); 
       reader = new StreamReader(stream); 
       writer = new StreamWriter(stream); 
       string msg = reader.ReadLine(); 
       listBox1.Items.Add("Recieved form server:"); 
       listBox1.Items.Add(msg); 
      } 
      catch (Exception ex) 
      { 

       MessageBox.Show(ex.Message); 
      } 

     } 

     private void send_Click(object sender, EventArgs e) 
     { 

      string msg = M.Text; 
      SymmetricAlgorithm symmetricAlgorithm = SymmetricAlgorithm.Create(); 
      byte[] data = Encoding.UTF8.GetBytes("password"); 


      symmetricAlgorithm.Key = GetLegalKey("PASSWORD"); 
      symmetricAlgorithm.IV = GetLegalIV(); 
      byte[] cipher = Encrypt(symmetricAlgorithm, data); 
      System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 
      msg = enc.GetString(cipher); 

      // System.Text.Encoding encoding=new System.Text.Encoding() ; 
      System.Text.ASCIIEncoding denc = new System.Text.ASCIIEncoding(); 
      Byte[] dec_data = denc.GetBytes(msg); 
      string decode = Decrypt(symmetricAlgorithm, dec_data); 

      try 
      { 

       writer.WriteLine(msg); 
       writer.Flush(); 
       msg = reader.ReadLine(); 
       if (msg.Length!=0) 
       listBox1.Items.Add(decode); 
      } 
      catch (Exception ex) 
      { 

       MessageBox.Show(ex.Message); 
      } 
     } 

     private static byte[] Encrypt(SymmetricAlgorithm symmetricAlgorithm, 

      byte[] data) 
     { 

      // FileStream outStream = File.OpenWrite(outPath); 



      ICryptoTransform transform = symmetricAlgorithm.CreateEncryptor(); 

      MemoryStream t = new MemoryStream(); 

      CryptoStream cryptoStream = 

       new CryptoStream(t, transform, CryptoStreamMode.Write); 



      Byte[] inFile = data; 
      // File.ReadAllBytes(inPath); 



      cryptoStream.Write(data, 0, data.Length); 
      cryptoStream.FlushFinalBlock(); 
      cryptoStream.Close(); 
      return t.ToArray(); 

     } 



     private static string Decrypt(SymmetricAlgorithm symmetricAlgorithm, 

      byte[] cipher) 
     { 

      ICryptoTransform transform = symmetricAlgorithm.CreateDecryptor(); 



      // Stream inStream = File.OpenRead(inPath); 
      MemoryStream inStream = new MemoryStream(); 

      CryptoStream cryptoStream = 

       new CryptoStream(inStream, transform, CryptoStreamMode.Write); 



      Byte[] buffer = new Byte[100]; 
      cryptoStream.Write(cipher, 0, cipher.Length); 
      cryptoStream.FlushFinalBlock(); 
      //Console.WriteLine(); 
      return Encoding.UTF8.GetString(inStream.ToArray()); 


      // int length = cryptoStream.Read(buffer, 0, buffer.Length); 



      // Stream outStream = File.OpenWrite(outPath); 

      /* while (length > 0) 

      { 

       outStream.Write(buffer, 0, length); 

       length = cryptoStream.Read(buffer, 0, buffer.Length); 

      }*/ 


      //inStream.Close(); 

      // outStream.Close(); 

     } 

     private byte[] GetLegalKey(string Key) 
     { 
      SymmetricAlgorithm symmetricAlgorithm = SymmetricAlgorithm.Create(); 
      string sTemp = Key; 
      symmetricAlgorithm.GenerateKey(); 
      byte[] bytTemp = symmetricAlgorithm.Key; 
      int KeyLength = bytTemp.Length; 

      if (sTemp.Length > KeyLength) 
       sTemp = sTemp.Substring(0, KeyLength); 
      else if (sTemp.Length < KeyLength) 
       sTemp = sTemp.PadRight(KeyLength, ' '); 

      return ASCIIEncoding.ASCII.GetBytes(sTemp); 
     } 

     private byte[] GetLegalIV() 
     { 
      string initialIV = "12345678"; 
      SymmetricAlgorithm symmetricAlgorithm = SymmetricAlgorithm.Create(); 
      // The initial string of IV may be modified with any data you like 
      string sTemp = initialIV; 
      symmetricAlgorithm.GenerateIV(); 
      byte[] bytTemp = symmetricAlgorithm.IV; 
      int IVLength = bytTemp.Length; 

      if (sTemp.Length > IVLength) 
       sTemp = sTemp.Substring(0, IVLength); 
      else if (sTemp.Length < IVLength) 
       sTemp = sTemp.PadRight(IVLength, ' '); 

      return ASCIIEncoding.ASCII.GetBytes(sTemp); 
     } 
    } 
} 
+0

你能縮短這段代碼嗎? – Stecya 2011-05-19 10:37:56

+0

這與您以前的已解決問題沒有什麼不同。如果你有問題要問,請問問題;不要只發布大量的代碼。 http://stackoverflow.com/questions/6052593/padding-is-invalid-and-cannot-be-removed-on-cryptostream-flushfinalblock – LukeH 2011-05-19 10:40:24

回答

6

這就是問題所在:

byte[] cipher = Encrypt(symmetricAlgorithm, data); 
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 
msg = enc.GetString(cipher); 

永遠,永遠做到這一點。

加密的數據是而不是一個ASCII編碼的字符串,所以不要這樣對待它。改用base64。所以這個片段應該是:

byte[] cipher = Encrypt(symmetricAlgorithm, data);  
msg = Convert.ToBase64String(cipher); 

和反向應該是:

byte[] dec_data = Convert.FromBase64String(msg); 

你永遠不應該對待不透明的二進制數據,就好像它是真的編碼的文本。這就像試圖加載MP3文件,就好像它是JPG一樣。這不是 - 你會失去數據。

+0

我這樣做,但現在有一個新問題: 解密數據的長度是無效的。 – Nik 2011-05-19 11:16:49

+0

@Nahel:嗯,我建議你通過嘗試立即解密字節數組* *來檢查你的加密/解密代碼有什麼問題,而不執行*任何*種類的轉換。 – 2011-05-19 11:56:22

相關問題