【问题标题】:Calculate maximum size for encrypted data计算加密数据的最大大小
【发布时间】:2009-06-17 12:55:19
【问题描述】:

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

加密方式:RijndaelManaged

填充:PKCS7

密码模式:CBC

块大小 128

密钥大小:128

我需要这个,因为我正在转换一个所有字符串都将被加密的数据库,所以我需要更改所有字符串字段的大小。

【问题讨论】:

    标签: math encryption aes rijndaelmanaged rijndael


    【解决方案1】:

    您需要尝试的一切:

    
       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
          /// &lt/summary>
          /// &ltparam name="inputBuffer">The input buffer&lt/param>
          /// &ltreturns>Size of the encrypted buffer&lt/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.
      

      【讨论】:

      • 小心第二个等式,并非每种语言都按照您假设的方式处理负数的模数。例如,C/C++ 在这些语言中会给你错误的答案为 (-a % b) == -(a % b)。
      【解决方案3】:

      Jeff 的回答几乎是正确的,除了 PKCS7 将始终为消息添加填充,即使消息完全适合整数个块。另外,不要忘记,如果使用随机 IV,IV 也必须被存储。 PKCS7 填充消息长度的更正公式为:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多