2009-06-17 11 views
8

¿Hay alguna forma de calcular el resultado más grande a partir de un cifrado Rijndael con una longitud de matriz fija?Calcular el tamaño máximo para los datos cifrados

Método de cifrado: RijndaelManaged

Relleno: PKCS7

CipherMode: CBC

BlockSize 128

keysize: 128

Necesito esto como im convertir una base de datos donde todos cuerdas van a estar encriptados, así que necesito cambiar el tamaño de todos los campos de cadenas.

Respuesta

3

Todo lo necesario 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 }); 
     } 

     /// &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

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

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

Cuidado con la segunda ecuación, no todos los idiomas maneja el módulo de un número negativo la forma en que lo estás asumiendo C/C++, por ejemplo, le dará la respuesta incorrecta como (-a% b) == - (a% b) en esos idiomas. – Naaff

+1

Buen punto. Eliminé el segundo para evitar confusiones. –

2

respuesta de Jeff es casi correcta, excepto que PKCS7 siempre va a agregar relleno al mensaje, incluso si el mensaje se ajusta exactamente dentro de un número entero de bloques. Además, no olvide que si usa una IV aleatoria, la IV también debe almacenarse. La fórmula corregido para la longitud de un mensaje acolchada PKCS7 es:

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