2013-02-03 45 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

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