2009-06-17 53 views
8

有没有什么方法可以计算固定数组长度的Rijndael加密的最大结果?计算加密数据的最大大小

加密方法:RijndaelManaged的

填充:PKCS7

CipherMode:CBC

BLOCKSIZE 128

密钥大小:128

予需要此作为即时通讯转换数据库,在那里所有的字符串将被加密,所以我需要改变所有字符串字段的大小。

回答

3

你需要的一切尝试了这一点:


    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

是的。将输入大小舍入到块大小的最接近的倍数(例如128/8 = 16字节)。

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

小心的第二个方程,不是每一种语言处理负数的模你假设的方式。例如,C/C++会在这些语言中给出错误答案(-a%b)== - (a%b)。 – Naaff 2009-06-17 13:33:43

2

Jeff的答案几乎是正确的,只是PKCS7总是添加填充到消息,即使消息恰好块的整数倍内适合。另外,不要忘记,如果使用IV也必须存储的随机IV。为PKCS7填充消息的长度修正公式为:

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