0

Я пытаюсь зашифровать байт [], используя следующие методы, но когда я его расшифровываю, мой байт [] больше, чем когда я начал, и я думаю, что это нужно делать с дополнением, но я не уверен, как его решить.AES Encrypt/Decrypt byte []

Метод еще не закончен (я знаю, что его плохо добавить ключ + iv, как мой пример, но его для тестирования, чтобы заставить его работать, прежде чем я начну двигаться).

Итак, когда я пытаюсь открыть файл после него (протестирован с файлом MS Word), я получаю сообщение о повреждении файла и хотел бы его отремонтировать.

Шифрование Метод

public byte[] Encrypt(byte[] dataToEncrypt) { 
     // Check arguments. 
     if (dataToEncrypt == null || dataToEncrypt.Length <= 0) { 
      throw new ArgumentNullException("dataToEncrypt"); 
     } 

     byte[] encryptedData; 
     byte[] key; 
     byte[] iv; 

     // Create an Aes object 
     using (Aes aesAlg = Aes.Create()) { 
      key = aesAlg.Key; 
      iv = aesAlg.IV; 

      // Create a encrytor to perform the stream transform. 
      ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 

      // Create the streams used for encryption. 
      using (MemoryStream memoryStream = new MemoryStream()) { 
       using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { 
        cryptoStream.Write(dataToEncrypt, 0, dataToEncrypt.Length); 
        cryptoStream.FlushFinalBlock(); 

        encryptedData = memoryStream.ToArray(); 

       } 
      } 


     } 

     byte[] result = new byte[encryptedData.Length + KEY_SIZE + IV_SIZE]; 

     Buffer.BlockCopy(key, 0, result, 0, KEY_SIZE); 
     Buffer.BlockCopy(iv, 0, result, KEY_SIZE, IV_SIZE); 
     Buffer.BlockCopy(encryptedData, 0, result, KEY_SIZE + IV_SIZE, encryptedData.Length); 

     return result; 
    } 

Расшифровать Метод

public byte[] Decrypt(byte[] encryptedData) { 
     // Check arguments. 
     if (encryptedData == null || encryptedData.Length <= 0) { 
      throw new ArgumentNullException("encryptedData"); 
     } 

     byte[] storedKey = new byte[KEY_SIZE]; 
     byte[] storedIV = new byte[IV_SIZE]; 
     byte[] dataToDecrypt = new byte[encryptedData.Length - (KEY_SIZE + IV_SIZE)]; 

     Buffer.BlockCopy(encryptedData, 0, storedKey, 0, KEY_SIZE); 
     Buffer.BlockCopy(encryptedData, KEY_SIZE, storedIV, 0, IV_SIZE); 
     Buffer.BlockCopy(encryptedData, KEY_SIZE + IV_SIZE, dataToDecrypt, 0, encryptedData.Length - (KEY_SIZE + IV_SIZE)); 

     byte[] decryptedData = null; 

     // Create an AesCryptoServiceProvider object 
     // with the specified key and IV. 
     using (Aes aesAlg = Aes.Create()) { 
      aesAlg.Key = storedKey; 
      aesAlg.IV = storedIV; 

      // Create a decrytor to perform the stream transform. 
      ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 

      // Create the streams used for decryption. 
      using (MemoryStream memoryStream = new MemoryStream(dataToDecrypt)) { 
       using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) { 
        cryptoStream.Read(dataToDecrypt, 0, dataToDecrypt.Length); 

        decryptedData = memoryStream.ToArray(); 
       } 
      } 

     } 

     return decryptedData; 
    } 
+0

Вы уверены, что не меньше? Поскольку один метод чтения не является хорошей практикой в ​​отношении обработки потоков. –

+0

больше, файл перед шифрованием был байтом [9865], а после дешифровки он был байтом [9877]. –

ответ

0

Вы полагаете, что весь буфер данных открытого текста, а также. Вы должны вернуть только ту часть буфера, которая содержит данные открытого текста (с ответом Read, чтобы узнать, сколько байтов возвращается). Зашифрованные данные обычно больше , потому что прокладки.

Как один метод чтения не является хорошей практикой в ​​отношении обработки потока. Вам нужно прочитать до конца потока. В противном случае у вас может быть слишком много данных, чтобы иметь слишком мало.

+0

Я знал, что это что-то связано с дополнением, но не могло понять, как это сделать, многие примеры, которые я нашел, касались шифрования/расшифровки строк. Не могли бы вы дать небольшой пример того, что должно быть внутри CryptoStream? Я видел несколько примеров, которые говорят, что строка stringText = cryptoStream.ReadToEnd(), а затем получает байты из plainText, но это не работает (я не могу вспомнить ошибку, которую он дал мне, поскольку я не на своем ноутбуке с кодом). –