首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >mcrypt_decrypt解密不起作用吗?

mcrypt_decrypt解密不起作用吗?
EN

Stack Overflow用户
提问于 2011-11-22 15:17:07
回答 2查看 4.1K关注 0票数 1

似乎mcrypt_decrypt 无法正确解密字符串(除非解密- load_decrypted值是错误的,否则在var_dump中所有操作都很好)。任何帮助都将不胜感激。

代码语言:javascript
代码运行次数:0
运行
复制
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)

PHP load()函数:

代码语言:javascript
代码运行次数:0
运行
复制
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));
}

PHP save()函数:

代码语言:javascript
代码运行次数:0
运行
复制
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));

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-22 15:21:41

不幸的是,在加载和保存过程中都需要相同的$iv。

代码语言:javascript
代码运行次数:0
运行
复制
// Creates a random value so that the same message encoded with the same key
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

绕过它的一种方法是使用

代码语言:javascript
代码运行次数:0
运行
复制
$mode = MCRYPT_MODE_CFB;

代码语言:javascript
代码运行次数:0
运行
复制
$encrypted = mcrypt_encrypt($cipher, $key, $iv . $message, $mode, $iv);

将编码的消息前缀为IV,然后在解码时使用

代码语言:javascript
代码运行次数:0
运行
复制
$decrypted = mcrypt_decrypt($cipher, $key, $encrypted, $mode, str_pad('', $iv_size));
$decrypted = substr(rtrim($decrypted, "\0"), $iv_size);

CFB有能力在解密过程中重新同步,并且可以使用这个“恢复”功能将你的IV放进去。

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

代码语言:javascript
代码运行次数:0
运行
复制
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
票数 2
EN

Stack Overflow用户

发布于 2011-11-22 15:21:12

您每次都使用不同的IV来加密和解密。所以基本上你用一个键锁定你的数据,然后用一个完全不同的键来解锁它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8229136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档