2017-09-18 75 views
0

私の要件は以下の通りです。 手順1)ローカルファイルシステムに101 MBのデータを10〜10 MBのチャンクで暗号化して書き込みたいとします。埋め込みが無効であり、復号化するデータの例外と長さが無効です。 Rijndael

ステップ2)解読中に、ファイルから10-10 MBのデータを取り出したい場合、解読して10-10 MBを他の関数に復号化したいとします(注:最後のチャンクサイズは1 MBですファイルサイズは101 MBです)。私は唯一の10メガバイトを解読しようとすると、それは私がときにNoneにpaddingModeを与えた場合は、エラー、「パディングは無効であり、削除することはできません」解読しながら、今)

2与え

ので

1)最後のチャンクは1MBとなり、「解読するデータの長さは無効です」というエラーが返されます。最大100 MBのものが動作しています

注: 1)最大100 MBのものが期待通りに動作しています。最後のチャンクサイズが1 MBではなく10 MBであれば、最終的に目標ファイルサイズは101 MBではなく110 MBになります。 2)私は暗号化中にパディングモードを与えていませんが、パディングは無効なエラーではなく、解読中は何も与えていません。一時的に私はそのコードをコメントしました。 - エラー

「パディングが無効である

private void WriteStreamInChunks(Stream fsstream, string filePath) 
    { 
     int chunkSize = 10 * 1024 * 1024; 
     byte[] buffer = new byte[chunkSize]; 

     using (var rijndaelManaged = new RijndaelManaged()) 
     { 
      var encryptor = rijndaelManaged.CreateEncryptor(EncryptionKey, EncryptionIV); 

      using (var fileStream = File.Create(filePath)) 
      { 
       using (var cryptoStream = new CryptoStream(fileStream, encryptor, CryptoStreamMode.Write)) 
       { 
        int bytesRead; 
        while ((bytesRead = fsstream.Read(buffer, 0, chunkSize)) > 0) 
        { 
         cryptoStream.Write(buffer, 0, bytesRead); 
        } 

        if (!cryptoStream.HasFlushedFinalBlock) 
         cryptoStream.FlushFinalBlock(); 
       } 
      } 
     } 
    } 

復号化のみチャンクとバイトが[]コードを返す:私は、暗号化と復号化

暗号化コードのために同じキーとIVを使用しています

3) "パディングモードを0に設定した場合、データの長さが無効になります。

public byte[] GetDecryptedFileContent(string filePath, long chunkSizeInBytes, long seekValue, long fileSize, string encryptionIV) 
    { 
     var sourceFile = new FileInfo(filePath); 
     var buffer = new byte[chunkSizeInBytes]; 

     byte[] encryptionKey = File.ReadAllBytes(Utils.GetSymmetricAlgoEncryptionKey()); 

     using (var fileStream = File.Open(sourceFile.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     { 
      fileStream.Seek(seekValue, SeekOrigin.Begin); 
      using (var binaryReader = new BinaryReader(fileStream)) 
      { 
       binaryReader.Read(buffer, 0, buffer.Length); 
      } 
     } 

     using (MemoryStream dataOut = new MemoryStream()) 
     { 
      using (RijndaelManaged rijndaelManaged = new RijndaelManaged()) 
      { 
       //rijndaelManaged.Padding = PaddingMode.None; 

       ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(encryptionKey, Convert.FromBase64String(encryptionIV)); 

       using (CryptoStream cryptoStream = new CryptoStream(dataOut, decryptor, CryptoStreamMode.Write)) 
       { 
        cryptoStream.Write(buffer, 0, buffer.Length); 
        return dataOut.ToArray(); 
       } 
      } 
     } 
     return null; 
    } 

私の要件によると、このGetDecryptedFileContent関数からbyte []を返す必要があります。 私はファイルサイズが0になるまでこの関数を複数回呼び出します。つまり、すべてのチャンクに対してです。 enter code here 誰かが私を助けてくれますか?

私は10から10メガバイトだけ戻したいと思います。

答えて

0

入力はブロックサイズを複数指定するか、パディングを使用する必要があります。パディングは、暗号化された最後のブロックのみに追加されます。 PKCS#7 paddingを参照してください。

ファイルの一部を一度に読み取る場合は、チャンクサイズがブロックサイズの倍数であることを確認してください。読み込み時には、ファイルの最後のブロックを除くすべてのブロックにパディングを指定しないで、ファイルの最後のブロックにパディングを指定します。

更新:IVを使用しているため、CBCモードを使用しているようです。その場合、最初のブロックを超えるすべてのブロックについて、IVは前のブロックになります。直前のブロックを読み、それをIVに使用してください。 CBC modeを参照してください。

+0

ご回答いただきありがとうございます。 –

+0

お返事ありがとうございます。 ここでやろうとしているのは です。1)すべてのコンテンツを1つに暗号化してファイルに書き出しています。 2)ファイルを解読したいと思います。ファイルサイズが101 MBで、チャンクサイズが20 MBの場合は20-20 MBです。復号化したいデータがあれば、それを返すことにします。 –

関連する問題