Рассчитать максимальный размер зашифрованных данных - PullRequest
8 голосов
/ 17 июня 2009

Есть ли способ рассчитать наибольший результат от шифрования Rijndael с фиксированной длиной массива?

Метод шифрования: RijndaelManaged

Заполнение: PKCS7

CipherMode: CBC

BlockSize 128

Размер ключа: 128

Мне нужно это, так как я преобразую базу данных, в которой все строки будут зашифрованы, поэтому мне нужно изменить размер всех строковых полей.

Ответы [ 3 ]

3 голосов
/ 24 июня 2009

Все, что вам нужно, чтобы попробовать это:


   public partial class Form1 : Form
   {
      private SymmetricAlgorithm mEncryptionType;

      public Form1()
      {
         mEncryptionType = new RijndaelManaged();
         mEncryptionType.Padding = PaddingMode.PKCS7; //PaddingMode.None;
         mEncryptionType.Mode = CipherMode.CBC;
         mEncryptionType.BlockSize = 128; // 192; // 256; // Update byte array to IV when changed
         mEncryptionType.KeySize = 128; // 192; // 256; // Update byte array to Key when changed
         mEncryptionType.IV = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                                           0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
         mEncryptionType.Key = new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
                                           0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };

         int encrypted_size = CalculateEncryptedSize(new byte[] { 0x22, 0x23, 0x44 });
         // Shows Theran's point about exact block size
         encrypted_size = CalculateEncryptedSize(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
                                           0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF  });
      }

      /// &ltsummary>
      /// Calculate the encrypted size of input buffer
      /// &lt/summary>
      /// &ltparam name="inputBuffer">The input buffer&lt/param>
      /// &ltreturns>Size of the encrypted buffer&lt/returns>
      public int CalculateEncryptedSize(byte[] inputBuffer)
      {
         int extra_padding = 0;
         if (mEncryptionType.Padding != PaddingMode.None)
         {
            int padding_size = (mEncryptionType.BlockSize / 8);
            extra_padding = (padding_size - (inputBuffer.Length % padding_size));
         }
         return inputBuffer.Length + extra_padding;
      }
   }
2 голосов
/ 19 июня 2009

Ответ Джеффа почти верен, за исключением того, что PKCS7 всегда добавляет к сообщению заполнение, даже если сообщение точно помещается в целое число блоков. Кроме того, не забывайте, что если вы используете случайный IV, то этот IV тоже нужно хранить. Исправленная формула для длины дополненного сообщения PKCS7:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly
maxSize = inputSize + extraBytesNeeded + IVbytes;
2 голосов
/ 17 июня 2009

Да. Округлите ваш входной размер до ближайшего значения, кратного размеру вашего блока (например, 128/8 = 16 байт).

extraBytesNeeded = (16 - (inputSize % 16)) % 16;
maxSize = inputSize + extraBytesNeeded.
...