Domanda

Esiste un modo per calcolare il risultato più grande da una crittografia Rijndael con una lunghezza dell'array fissa?

Metodo di crittografia: RijndaelManaged

Imbottitura: PKCS7

CipherMode: CBC

BlockSize 128

Dimensione: 128

Ho bisogno di questo come sto convertendo un database in cui tutte le stringhe saranno crittografate, quindi ho bisogno di cambiare la dimensione di tutti i campi di stringa.

È stato utile?

Soluzione

Tutto il necessario per provarlo:


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

Altri suggerimenti

Sì. Arrotondare la dimensione dell'input al multiplo più vicino della dimensione del blocco (ad esempio 128/8 = 16 byte).

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

La risposta di Jeff è quasi corretta, tranne per il fatto che PKCS7 aggiungerà sempre il riempimento al messaggio, anche se il messaggio si inserisce esattamente in un numero integrale di blocchi. Inoltre, non dimenticare che se si utilizza un IV casuale anche il IV deve essere memorizzato. La formula corretta per la lunghezza di un messaggio imbottito PKCS7 è:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly
maxSize = inputSize + extraBytesNeeded + IVbytes;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top