【问题标题】:PHP decrypt not working using mcrypt_decrypt?PHP解密无法使用mcrypt_decrypt?
【发布时间】:2012-01-03 23:23:21
【问题描述】:

似乎mcrypt_decrypt 无法正确解密我的字符串(在var_dump 中一切正常,除非在解密时 - load_decrypted 值错误)。任何帮助将不胜感激。

array
  'salve_plain' => string 'a:1:{s:8:"modified";i:1321974656;}' (length=34)
  'save_encrypted' => string '^ånÄc¥JŸRæk®»}J%áR–y #‡nwZX\µÚ™È§œ‘5‚<_¹M¿ÔT9k)…ª  Ø' (length=64)
  'save_encoded' => string 'XuVuxGOlA0qfUuYXa667fUoSEyXhBVKWeSAjh253EFpYXLUS2pnIp5yRNa3LgjxfuRNNv9RUOe67qmsphaoJ2A==' (length=88)

array
  'load_undecoded' => string 'XuVuxGOlA0qfUuYXa667fUoSEyXhBVKWeSAjh253EFpYXLUS2pnIp5yRNa3LgjxfuRNNv9RUOe67qmsphaoJ2A==' (length=88)
  'load_decoded' => string '^ånÄc¥JŸRæk®»}J%áR–y #‡nwZX\µÚ™È§œ‘5‚<_¹M¿ÔT9k)…ª    Ø' (length=64)
  'load_decrypted' => string '-dœÞ{*€ ¥ûü(1À�ðú-›(!*»ÓÍW¦;}' (length=34)

PHPload()函数:

private function load()
{

    // Decoding
    $plain = file_get_contents($this->filename);
    $decoded = base64_decode($plain);

    // Decrypting
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->secret),
        $decoded, MCRYPT_MODE_CBC, $iv));

    // Deserializing & loading
    $this->data = unserialize($decrypted);
    var_dump(array('load_undecoded' => $plain, 'load_decoded' => $decoded,
        'load_decrypted' => $decrypted));
}

PHPsave() 函数:

private function save()
{

    // Serialization
    $serialized = serialize($this->data);

    // Encrypting
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($this->secret),
        $serialized, MCRYPT_MODE_CBC, $iv);

    // Encoding & saving
    $encoded = base64_encode($encrypted);
    file_put_contents($this->filename, $encoded);

    var_dump(array('salve_plain' => $serialized,
        'save_encrypted' => $encrypted, 'save_encoded' => $encoded));

}

【问题讨论】:

  • 我已经开始使用解密软件来解决所有这些问题... Decry.pt 是我现在用于所有 php 的东西。我主要用它来解码IonCube..希望这有帮助。

标签: php encryption mcrypt


【解决方案1】:

您每次都使用不同的 IV 进行加密和解密。所以基本上你是用一把钥匙锁定你的数据,然后尝试用完全不同的钥匙解锁它。

【讨论】:

    【解决方案2】:

    不幸的是,您在加载和保存时都需要相同的 $iv。

    // Creates a random value so that the same message encoded with the same key
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    

    解决方法是使用

    $mode = MCRYPT_MODE_CFB;
    

    加密

    $encrypted = mcrypt_encrypt($cipher, $key, $iv . $message, $mode, $iv);
    

    用IV前缀编码的消息,然后在解码中使用

    $decrypted = mcrypt_decrypt($cipher, $key, $encrypted, $mode, str_pad('', $iv_size));
    $decrypted = substr(rtrim($decrypted, "\0"), $iv_size);
    

    CFB 能够在解密期间重新同步,并且可以使用此“恢复”功能来放入您的 IV。

    此外,根据您创建的 IV 的数量,您可能希望使用 urandom 而不是随机的。

    $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
    

    【讨论】:

    • 实际上,您可以使用任何 IV 使用模式(如 CBC、CTR 等)在密文前加上 IV - 您只需在解密前将其拆分即可。
    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 2012-11-10
    • 2016-09-01
    • 2011-11-09
    • 1970-01-01
    • 2023-03-05
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多