2011-05-19 169 views
1

我有以下用於加密和解密的代碼。問題是,除了解密的文本解密,我在文本後面有一些「aaaaa」。爲什麼?需要一些幫助。謝謝!Rijndael加密/解密

public static byte[] Encrypt(byte[] PlainTextBytes, string key , string InitialVector) 
     { 
      try 
      { 
       System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
       Byte[] KeyBytes = encoding.GetBytes(key); 
       byte[] InitialVectorBytes = encoding.GetBytes(InitialVector); 
       RijndaelManaged SymmetricKey = new RijndaelManaged(); 
       ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes); 
       MemoryStream MemStream = new MemoryStream(); 
       CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write); 

       CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length); 
       CryptoStream.FlushFinalBlock(); 
       byte[] CipherTextBytes = MemStream.ToArray(); 

       return CipherTextBytes; 

// decrytion

public static string Decrypt(byte[] PlainTextBytes1, string key, string InitialVector) 
    { 
     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
     Byte[] KeyBytes = encoding.GetBytes(key); 
     RijndaelManaged SymmetricKey = new RijndaelManaged(); 
     byte[] InitialVectorBytes = Encoding.UTF8.GetBytes(InitialVector); 

     ICryptoTransform Decryptor = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes); 
     MemoryStream MemStream1 = new MemoryStream(PlainTextBytes1); 
     CryptoStream CryptoStream = new CryptoStream(MemStream1, Decryptor, CryptoStreamMode.Read); 
     Byte[] pltxt = new byte[PlainTextBytes1.Length]; 
     CryptoStream.Read(pltxt, 0, pltxt.Length); 

     ASCIIEncoding textConverter = new ASCIIEncoding(); 

     round = textConverter.GetString(pltxt); 
      return round; 

    } 

我在哪裏錯了?

+0

字節[]的大小是否相同? – 2011-05-19 07:31:02

+0

你是什麼意思? – ely 2011-05-19 08:05:14

+0

需要一些幫助..請給解決方案! – ely 2011-05-19 08:05:31

回答

5

在你解密功能,您有:

Byte[] pltxt = new byte[PlainTextBytes1.Length]; 

這是錯的,因爲暗號文本比純文本的時間越長,因爲它填補獲得塊大小的倍數。

CryptoStream.Read(pltxt, 0, pltxt.Length); 

Read返回實際返回的字節數。它不能保證它會返回您請求的字節數量。


然後還有其他多種缺陷/不良作風的事情:

  1. 傳入Decrypt的參數稱爲PlainTextBytes1它應該被稱爲密文。
  2. 您從字符串中創建密鑰/初始字節的方式。 ASCII編碼在這裏是一個不錯的選擇。 ASCII不能表示任何字節字符串。也許你想要十六進制/解碼一個字符串的兩倍大小的字符?
  3. ASCII編碼/解碼純文本只能用於ASCII字符,並會默默破壞所有其他字符。爲什麼不使用UTF-8呢?
  4. .net命名約定說您應該使用小寫字母名稱作爲參數
+0

thx爲答案!你能告訴我如何更正pltxt以獲得正確的結果嗎? PLZ :)。謝謝。我知道要求你重寫代碼太多了! – ely 2011-05-19 07:42:03

+0

加'MemoryStream'和'CryptoStream'都實現了'IDisposable',因此應該用'using'語句包裝 – ChrisWue 2011-05-19 07:45:46

+0

什麼是填充長度的解決方案? – ely 2011-05-19 08:04:57