2009-06-17 6 views
8

Existe-t-il un moyen de calculer le plus grand résultat d'un cryptage Rijndael avec une longueur de tableau fixe?Calculer la taille maximale pour les données encodées

Méthode de chiffrement: RijndaelManaged

Rembourrage: PKCS7

CipherMode: CBC

BlockSize 128

KeySize: 128

Je en ai besoin comme im la conversion d'une base de données où toutes les chaînes vont être chiffrés, donc je dois changer la taille de tous les champs de chaînes.

Répondre

3

Tout ce que vous devez 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 }); 
     } 

     /// &ltsummary> 
     /// Calculate the encrypted size of input buffer 
     /// </summary> 
     /// &ltparam name="inputBuffer">The input buffer</param> 
     /// &ltreturns>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; 
     } 
    } 
2

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

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

Attention à la deuxième équation, pas toutes les langues gère le modulo d'un nombre négatif la façon dont vous assumez. C/C++ par exemple, vous donnera la mauvaise réponse en tant que (-a% b) == - (a% b) dans ces langues. – Naaff

+1

Bon point. J'ai supprimé le second pour éviter toute confusion. –

2

réponse Jeff est presque correct, sauf que PKCS7 toujours ajouter un rembourrage au message, même si le message correspond exactement à l'intérieur d'un nombre entier de blocs. Aussi, n'oubliez pas que si vous utilisez un IV aléatoire, l'IV doit également être stockée. La formule corrigée pour la longueur d'un message rembourré PKCS7 est:

extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly 
maxSize = inputSize + extraBytesNeeded + IVbytes; 
Questions connexes