Question

Existe-t-il un moyen de calculer le résultat le plus important à partir d'un cryptage Rijndael avec une longueur de tableau fixe?

Méthode de cryptage: RijndaelManaged

Rembourrage: PKCS7

CipherMode: CBC

Taille du bloc 128

Taille de clé: 128

J'ai besoin de cela pour convertir une base de données dans laquelle toutes les chaînes vont être chiffrées. Je dois donc modifier la taille de tous les champs de chaîne.

Était-ce utile?

La solution

Tout ce dont vous avez besoin pour essayer ceci:


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

Autres conseils

Oui. Arrondissez votre taille d’entrée au multiple le plus proche de la taille de votre bloc (par exemple, 128/8 = 16 octets).

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

La réponse de Jeff est presque exacte, sauf que PKCS7 ajoutera toujours un remplissage au message, même si le message tient exactement dans un nombre entier de blocs. De plus, n'oubliez pas que si vous utilisez une perfusion IV aléatoire, celle-ci doit également être stockée. La formule corrigée pour la longueur d'un message PKCS7 complété est la suivante:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly
maxSize = inputSize + extraBytesNeeded + IVbytes;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top