似乎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)
PHP load()
功能:
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()
功能:
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));
}
答案 0 :(得分: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);
答案 1 :(得分:0)
您每次使用不同的IV进行加密和解密。所以基本上你用一把钥匙锁住你的数据,然后用一把完全不同的钥匙解锁它。