Pregunta

¿Hay alguna forma de calcular el resultado más grande de un cifrado Rijndael con una longitud de matriz fija?

Método de cifrado: RijndaelManaged

Relleno: PKCS7

Modo de cifrado: CBC

BlockSize 128

KeySize: 128

Necesito esto ya que estoy convirtiendo una base de datos donde todas las cadenas se cifrarán, así que necesito cambiar el tamaño de todos los campos de cadenas.

¿Fue útil?

Solución

Todo lo que necesitas para probar esto:


   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  });
      }

      /// <summary>
      /// Calculate the encrypted size of input buffer
      /// </summary>
      /// <param name="inputBuffer">The input buffer</param>
      /// <returns>Size of the encrypted buffer</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;
      }
   }

Otros consejos

Sí. Redondea tu tamaño de entrada al múltiplo más cercano de tu tamaño de bloque (por ejemplo, 128/8 = 16 bytes).

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

La respuesta de Jeff es casi correcta, excepto que PKCS7 siempre agregará relleno al mensaje, incluso si el mensaje cabe exactamente dentro de un número integral de bloques. Además, no olvide que si usa un IV aleatorio, el IV también debe almacenarse. La fórmula corregida para la longitud de un mensaje rellenado PKCS7 es:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly
maxSize = inputSize + extraBytesNeeded + IVbytes;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top