2016-09-20 1 views
0

から16以上のバイトだから私は1622バイトの長さで[]バイトを持っているが、私はそれをすべてを復号化したいが、AESは、128ビットの唯一のブロックサイズを持って復号化することができます。 イムは、私はこの例外を取得する16バイトのブロックにそれを分割しようとした場合: System.Security.Cryptography.CryptographicException 追加情報:入力バッファが不十分なデータが含まれています。はそのrawDataAreaの16%にすることができます!= 0は、どのように私はバイトが[] AES

Encryptorは:

 aes256Alg = new AesManaged 
     { 
      Key = new byte[] {112,90,16,164,90,221,73,154,246,32,13,102,145,7,57,115,37,5,3,102,205,39,202,231,195,148,202,229,53,138,102,242}, 
      Mode = CipherMode.CBC, 
      KeySize = 256, 
      BlockSize = 128, 
      Padding = PaddingMode.PKCS7, 
      IV = new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 
     }; 
     ICryptoTransform aes256Encryptor = aes256Alg.CreateEncryptor(aes256Alg.Key,aes256Alg.IV); 

の復号化

 AesManaged aes256AlgCBC; 
     aes256AlgCBC = new AesManaged 
     { 
      Key = new byte[] {190,151,28,108,241,101,254,174,16,11,87,84,239,140,239,85,195,25,78,192,105,109,95,128,160,146,123,31,190,188,181,216}, 
      KeySize = 256, 
      Mode = CipherMode.CBC, 
      BlockSize = 128, 
      Padding = PaddingMode.PKCS7, 
      IV = new byte[] {199,114,91,241,148,90,133,166,13,52,142,187,101,125,81,73} 
     }; 
     ICryptoTransform aes256CbcDecryptor = aes256AlgCBC.CreateDecryptor(aes256AlgCBC.Key, aes256AlgCBC.IV); 



     //byte[] rawDataArea = {0x00 .......} // Length of 1622 copied from hexeditor 

     List<Byte[]> dataAreaByteList = new List<byte[]>(); 
     //Split the rawDataArea up to blocks of 16 bytes and then adding them to a list 
     //which later can be converted back to a big array 

     for (int i = 0; i < rawDataArea.Length; i += 16) 
     { 
      byte[] transformedBlock = new byte[] { }; 
      aes128CbcDecryptor.TransformBlock(rawDataArea, i, (i += 16),transformedBlock,i); 
      dataAreaByteList.Add(transformedBlock); 
     } 
+1

バイト配列の長さは、パディングの出番です、そうでない場合は16倍にする必要があります。 – ThePerplexedOne

+1

'TransformBlock'形式のインターフェイスを使いたい場合は、[' TransformFinalBlock'](https://msdn.microsoft.com/en-us/library/system.security.cryptography.icryptotransform.transformfinalblock v = .110).aspx)を最後のブロックに置きます。具体的には、ブロック全体と同じではないデータのまとまりが可能です。 –

答えて

3

あなたはループの反復ごとi += 16 2回を実行しています。とにかく16バイトのチャンクで変換する必要はありません。 CryptoStreamを使用し、好きな金額(4KBなど)を書いてください。ほとんどのチュートリアルでこれが行われます。たぶん、あなたは悪いチュートリアルを見つけました。

+0

ありがとう、私は今それについてのチュートリアルに従ってください。私はupvoteし、それが動作する場合を受け入れる:) –