Frage

Gibt es eine Möglichkeit, das größte Ergebnis von einer Rijndael Verschlüsselung mit einem festen Feldlänge zu berechnen?

Verschlüsselungsmethode: RijndaelManaged

Padding: PKCS7

CipherMode: CBC

Blocksize 128

KeySize: 128

Ich brauche dies als im Konvertieren einer Datenbank, in der alle Zeichenfolge verschlüsselt werden werden, so kann ich die Größe aller String-Felder müssen geändert werden.

War es hilfreich?

Lösung

Alles was Sie brauchen um das auszuprobieren:


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

Andere Tipps

Ja. Aufrunden Ihre Eingabegröße zum nächsten Vielfachen der Blockgröße (z 128/8 = 16 Bytes).

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

Jeffs Antwort ist fast richtig, mit der Ausnahme, dass PKCS7 immer Polsterung in die Nachricht einzufügen, auch wenn die Nachricht genau innerhalb einer ganzen Anzahl von Blöcken paßt. Auch vergessen Sie nicht, dass, wenn eine zufällige IV verwenden, die IV werden gespeichert hat. Die korrigierte Formel für die Länge einer PKCS7 gepolsterten Nachricht ist:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly
maxSize = inputSize + extraBytesNeeded + IVbytes;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top