2013-02-03 47 views
0

我使用AES加密。當我加密並解密整個文件時沒關係。我想將多個文件添加到一個加密的文件中。這就是問題所在。加密很好,但解密會導致CryptographicException - 數據長度不正確。解密部分文件還是可以加密?我使用了一個cryptostream,並將想要加密的所有文件傳遞給單個文件。我正試圖做相反的事情:解密部分AES流

AesManaged aes = AES.InitAes(key, salt); 
      ICryptoTransform transform = aes.CreateDecryptor(aes.Key, aes.IV); 
      int defChunkSize = 1024 * 1024 * 50; 

      using (FileStream source = new FileStream(header.data.filename, FileMode.Open)) 
      { 
       foreach (CryptHeader.fileStruct file in header.data.files) 
       { 
        preparePath(file.filename); 

        using (FileStream target = new FileStream(file.filename, FileMode.Create)) 
        { 
         using (CryptoStream cryptoStream = new CryptoStream(target, transform, CryptoStreamMode.Write)) 
         { 
          long padding = source.Length - header.data.files.Sum(x => x.length);//Just test 
          int chunkSize = (defChunkSize > (int)file.length) ? (int)file.length : defChunkSize; 
          byte[] chunkData = new byte[chunkSize]; 
          int bytesRead = 0; 
          int totalRead = 0; 
          while (totalRead < file.length) 
          { 
           bytesRead = source.Read(chunkData, 0, chunkSize); 
           if (bytesRead <= 0) break; 
           totalRead += bytesRead; 
           cryptoStream.Write(chunkData, 0, bytesRead); 
          }  
          chunkData = null; 
         } 
        } 
       } 
      }  

回答

2

我幾年前也做了同樣的沒有任何問題。我使用的邏輯如下:文件

  • 加密

    1. 限定數目限定陣列用於保持加密尺寸

    2. 開放輸出流

    3. 尋找(強制)到(文件數量* 4)+4(假設長度爲整數)

    4. 循環用於加密(encrypt-寫加密數據加密-assigned大小)

    5. 尋求爲0(開始)文件的

    6. 寫入數

    7. 寫入加密尺寸數組

    8. 靠近輸出流

    解密

    1. 開放輸入流

    2. 讀取文件

    3. 的數目限定讀取填充陣列加密尺寸

    4. 循環用於解密(閱讀使用已知尺寸

    5. 接近輸出流

    我希望這會有所幫助。

  • 0

    簡寫:「你不能從那裏到達」,這是不可能的。

    如果你看一下AES工作原理的描述,你會看到兩件事。

    1 AES使用128個比特的塊大小,因此,如果文件不在的長度爲8個字節的倍數在所附部分塊不會排隊,

    2:AES使用使用不同的密鑰根據rijndael密鑰計劃的每個塊,這可能會成爲一個交易斷路器。

    如果您需要能夠來連接加密的文件或者包起來,這樣的連接是可見的碎片可以單獨解密(壓縮時的gzip做到這一點),或使用固定的置換密碼一樣ROT13

    0

    它可以完成,它的工作。我在加密期間創建包含加密文件長度的表格。比我解密確切的部分(填充)。