【问题标题】:Rijndael-256 encryption - Padding on end of decrypted stringRijndael-256 加密 - 解密字符串末尾的填充
【发布时间】:2012-12-14 18:25:15
【问题描述】:

所以,我正在尝试使用 mcrypt 解密 Rijndael-256,这一切都很好。 但是,在字符串的最后有填充,使其长度正好为 32 字节。 知道为什么吗?这是它的输出。

array (size=9)
  'cryptedText' => string 'O¿{žû¦ê§Þøµ; *¬rÄÅϧ„•T' (length=32)
  'IV' => string 'ÄêKG£ED^°“F¨ŠêFx)\e_¶üŠèJÂ|' (length=32)
  'title' => string 'Untitled' (length=8)
  'deleteKey' => string 'ff349d33af4cff27143f66680586121e3c17d1f81aee42c7beb645684ca95558447f0eba757c7ecc785ea39633cfad5a6144fd5ea5028ca9c342e15291d7fd60' (length=128)
  'date' => string '1356827615' (length=10)
  'uid' => string '0' (length=1)
  'urlID' => string '2' (length=1)
  'id' => string '2' (length=1)
  'decryptedText' => string 'hello woaaaaaaaaarld������������' (length=32)
                                                 ^^^^^^^^^^^^ This

如果我添加超过 32 个字符,它会填充到 64,等等...

我是这样解密的:

        $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');

        if (mcrypt_generic_init($cipher, $key, $result_set['IV']) != -1) {
            $decrypted = mdecrypt_generic($cipher, $result_set['cryptedText']);
            mcrypt_generic_deinit($cipher);
            mcrypt_module_close($cipher);
            $result_set['decryptedText'] = $decrypted;
        }

Rijndael-256 加密数据以 LONGBLOB(二进制)数据类型以及 IV 存储在我的数据库中。

【问题讨论】:

    标签: php mcrypt


    【解决方案1】:

    base64_encoding 我的数据在加密之前解决了这个问题。耶!

    【讨论】:

    • 我不是加密专家,但我很确定这会大大削弱您的加密,因为您的输入数据现在是一种非常可预测的格式。为什么不简单地去除空字节,或者添加一个指示输入数据长度的整数?
    • 为什么会削弱加密?
    • @FritsvanCampen 我不明白为什么这会使数据“以可预测的格式”。二进制在逻辑上是一回事,但没有人抱怨它是可预测的格式。
    • 因为您的输入字符串中只剩下 64 位熵,而不是理论上的 2^32。
    • @FritsvanCampen 你在说什么?
    【解决方案2】:

    http://php.net/manual/en/function.mcrypt-encrypt.php

    数据

    将使用给定密码和模式加密的数据。 如果数据的大小不是n * blocksize,数据会被填充 带有'\0'

    返回的密文可以大于数据的大小 由数据给出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2012-03-08
      相关资源
      最近更新 更多