2017-01-08 1 views
1

Мне интересно, почему шифрование/дешифрование работает только с небольшим размером 0 байтов на дисковых файлах, но перестает работать с более крупными файлами, где я получаю ошибки The input data is not a complete block и Index was outside the bounds of the array.

Я использую ECDiffieHellmanCng для создания того же симметричного ключа с обеих сторон.

Обмен ключами на стороне шифрования:
Шифрование AES работает только с небольшим размером 0 байтов на диске, файлы

using (ECDiffieHellmanCng sendingMode = new ECDiffieHellmanCng()) 
{ 
    sendingMode.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; 
    sendingMode.HashAlgorithm = CngAlgorithm.Sha256; 
    sendersPublicKey = sendingMode.PublicKey.ToByteArray(); 
    CngKey secretKey = CngKey.Import(receiversPublicKey, CngKeyBlobFormat.EccPublicBlob); 
    sendersKey = sendingMode.DeriveKeyMaterial(CngKey.Import(receiversPublicKey, CngKeyBlobFormat.EccPublicBlob)); 
    byte[] encryptedFile = null; 
    byte[] ivFile = null; 
    byte[] fileBytes = File.ReadAllBytes(fileToSendPath); 
    Encryption(sendersKey, fileBytes, out encryptedFile, out ivFile); 
} 

Биржевым принимающей стороны:

using (ECDiffieHellmanCng receivingMode = new ECDiffieHellmanCng()) 
{ 
    receivingMode.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; 
    receivingMode.HashAlgorithm = CngAlgorithm.Sha256; 
    receiversPublicKey = receivingMode.PublicKey.ToByteArray(); 

    CngKey secretKey = CngKey.Import(sendersPublicKey, CngKeyBlobFormat.EccPublicBlob); 
    receiversKey = receivingMode.DeriveKeyMaterial(CngKey.Import(sendersPublicKey, CngKeyBlobFormat.EccPublicBlob)); 
    byte[] decryptedFile = new byte[50000000]; 
    Decryption(encryptedFile, ivFile, out decryptedFile); 
} 

шифрования/дешифрования методы:

private void Encryption(byte[] key, byte[] unencryptedMessage,out byte[] encryptedMessage, out byte[] iv) 
{ 
    using (Aes aes = new AesCryptoServiceProvider()) 
    { 
      aes.Key = key; 
      iv = aes.IV; 

      // Encrypt the message 
      using (MemoryStream ciphertext = new MemoryStream()) 
      using (CryptoStream cs = new CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
       cs.Write(unencryptedMessage, 0, unencryptedMessage.Length); 
       cs.Close(); 
       encryptedMessage = ciphertext.ToArray(); 
      } 
     } 
} 

private void Decryption(byte[] encryptedMessage, byte[] iv, out byte[] decryptedMessage) 
{ 
     using (Aes aes = new AesCryptoServiceProvider()) 
     { 
      aes.Key = receiversKey; 
      aes.IV = iv; 
      // Decrypt the message 
      using (MemoryStream decryptedBytes = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(decryptedBytes, aes.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(encryptedMessage, 0, encryptedMessage.Length); 
        cs.Close(); 
        decryptedMessage = decryptedBytes.ToArray(); 
       } 
      } 
     } 
} 

ответ

1

AES является блочный шифр требует ввод должен быть в кратных размерах блоков, 16-байтовый для A ES. Простым решением является использование дополнения PKCS # 7 (née PKCS # 5), а дополнение будет прозрачно добавлено в шифрование и удалено при расшифровке.

Смежные вопросы