PHP расшифровывать не работает с помощью mcrypt_decrypt? - PullRequest
1 голос
/ 22 ноября 2011

Кажется, что 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));

}

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

К сожалению, вам нужны одинаковые $ 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, а не random.

$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
0 голосов
/ 22 ноября 2011

Вы используете разные IV для шифрования и дешифрования каждый раз.Таким образом, вы блокируете свои данные одним ключом, а затем пытаетесь разблокировать его совершенно другим ключом.

...