2015-10-16 82 views
0

我的代碼存在問題。 函數Decryptor中存在問題。CryptoStream錯誤填充無效,無法刪除

FlushFinalBlock擲 「填充是無效的,不能刪除」

在功能解密我得到長度6048的myData的, 當線cryptoStream.Write(myData的,0,myData.Length);完成我得到長度6032在memoryStream 然後行cryptoStream.FlushFinalBlock();拋出一個錯誤「填充無效,無法刪除。」你可以看到我使用的是Padding = PaddingMode.PKCS7;

static RijndaelManaged rmCrypto; 
static object lockCryptoStream = new object(); 

public static void SetrmCrypto() 
{ 
    rmCrypto = new RijndaelManaged(); 
    rmCrypto.Padding = PaddingMode.PKCS7; 
    rmCrypto.KeySize = 128; 
    rmCrypto.Key = new ASCIIEncoding().GetBytes("xxxxxxxxxxxxxxxx"); 
    rmCrypto.IV = new ASCIIEncoding().GetBytes("yyyyyyyyyyyyyyyy"); 
} 

public static byte[] Encryptor(byte[] myData) 
{ 
    lock (lockCryptoStream) 
    { 
     using (var memoryStream = new MemoryStream()) 
     { 
      using (var cryptoStream = new CryptoStream(memoryStream, rmCrypto.CreateEncryptor(rmCrypto.Key, rmCrypto.IV), CryptoStreamMode.Write)) 
      { 
       cryptoStream.Write(myData, 0, myData.Length); 
       cryptoStream.FlushFinalBlock(); 
       cryptoStream.Close(); 
       return memoryStream.ToArray(); 
      } 
     } 
    } 
} 

public static byte[] Decryptor(byte[] myData) 
{ 
    lock (lockCryptoStream) 
    { 
     using (var memoryStream = new MemoryStream()) 
     { 
      using (var cryptoStream = new CryptoStream(memoryStream, rmCrypto.CreateDecryptor(rmCrypto.Key, rmCrypto.IV), CryptoStreamMode.Write)) 
      { 
       cryptoStream.Write(myData, 0, myData.Length); 
       cryptoStream.FlushFinalBlock(); 
       cryptoStream.Close(); 
       return memoryStream.ToArray(); 
      } 
     } 
    } 
} 

在服務器上使用加密器,並通過UDP發送數據。 客戶端使用解密器解密數據。 代碼適用於大部分數據包,可以說它可以工作幾個小時,但之後我在Flushing上遇到這個錯誤。

+0

有人可以告訴我,如果我可以得到任何內存泄漏在上面的代碼? 我有點得到在套接字上收到的數據包經過長時間運行後延遲。可能是因爲Decrypting,這會阻塞socket.Receive()? – Martin86

回答

0

上面的代碼很好。 在我的情況下,問題是在服務器上鍵入C++和我有加密的問題(線程接收和發送問題)

相關問題