2017-09-18 15 views
0

내 요구 사항은 아래와 같습니다. 단계 1) 101-10 MB의 데이터 청크로 암호화하여 101 MB 데이터를 로컬 파일 시스템에 쓰고 싶습니다.패딩이 유효하지 않으며 예외를 제거 할 수 없으며 해독 할 데이터의 길이가 유효하지 않습니다. Rijndael

2 단계) 해독하는 동안 파일에서 10-10MB 데이터를 가져와 해독하고 10-10MB를 전달하여 다른 일부 기능에 암호를 해독하려고합니다 (참고 : 마지막 청크 크기는 1MB가됩니다.) 파일 크기는 101MB이므로). 내가 10 MB의 암호를 해독 할 때

그래서

1)이 오류를 제공 "패딩이 잘못 제거 할 수 없습니다"

2) 이제, 해독하면서, 내가 없음에 paddingMode을 줄 경우 때 마지막 덩어리는 1MB입니다. "해독 할 데이터의 길이가 유효하지 않습니다"라는 오류 메시지가 나타납니다. 개까지 100 메가 바이트 것들이 작동

참고 : 1) 최대 100 MB 것들이 예상대로 작동하고 있습니다. 마지막 청크 크기를 1MB 대신 10MB로 지정하면 작업 파일 크기는 101MB 대신 110MB가됩니다. 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 함수에서 바이트 []를 반환해야합니다. 이 함수는 파일 크기가 0이 될 때까지 여러 번 호출됩니다. 즉, 모든 청크에 대해. enter code here 누군가 나를 도와 줄 수 있습니까?

10-10 MB 만 반환하고 싶습니다.

답변

0

입력은 여러 블록 크기 여야하며 그렇지 않으면 패딩을 사용해야합니다. 패딩은 암호화 된 마지막 블록에만 추가됩니다. PKCS#7 padding을 참조하십시오.

파일의 한 번에 읽는 부분이 청크 크기가 블록 크기의 배수인지 확인하십시오. 읽는 동안 파일의 마지막 블록을 제외한 모든 블록에 대해 채우기를 지정하지 말고 파일의 마지막 블록에 대해 채우기를 지정하십시오.

업데이트 : IV를 사용 중이기 때문에 CBC 모드를 사용하고있는 것으로 보입니다. 이 경우 첫 번째 블록 이후의 모든 블록에 대해 IV가 이전 블록이됩니다. 이전 블록을 읽고 IV 용으로 사용하십시오. CBC mode을 참조하십시오.

+0

답변 해 주셔서 감사합니다. –

+0

답변 해 주셔서 감사합니다. 내가 여기서하려고하는 것은 입니다. 1) 모든 콘텐츠를 암호화하여 파일로 저장합니다. 2) 예를 들어 파일을 해독하고 싶습니다. 파일 크기가 101MB이고 청크 크기가 20MB라면 20-20MB입니다. 해독하고 싶은 데이터는 무엇이든 해독하고 싶습니다. 반환하고 싶습니다. –