ошибки декодирования mcrypt - PullRequest
0 голосов
/ 13 апреля 2010

У меня есть несколько проблем со следующими функциями php (часть большего класса).

    //encode
    public function acc_pw_enc($text, $key) {
    $text_num = str_split($text, 8);
    $text_num = 8 - strlen($text_num[count($text_num)-1]);

    for ($i=0; $i < $text_num; $i++) {
        $text = $text . chr($text_num);
    }

    $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', '');
    mcrypt_generic_init($cipher, $key, 'fYfhHeDm');
    $decrypted = mcrypt_generic($cipher, $text);
    mcrypt_generic_deinit($cipher);
    return base64_encode($decrypted);
}

    //decode
public function acc_pw_dec($encrypted_text, $key) {
    $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', '');
    mcrypt_generic_init($cipher, $key, 'fYfhHeDm');
    $decrypted = mdecrypt_generic($cipher, base64_decode($encrypted_text));
    mcrypt_generic_deinit($cipher);
    $last_char = substr($decrypted, -1);

    for($i=0; $i < 8-1; $i++) {
        if(chr($i) == $last_char) {      
            $decrypted = substr($decrypted, 0, strlen($decrypted)-$i);
            break;
        }
    }
    return rtrim($decrypted); //str_replace("?", "", $decrypted);
}

Так, например, если я зашифрую строку 'liloMIA01' с помощью соли / ключа 'yBevuZoMy', я получу 7A30ZkEjYbDcAXLgGE / 6nQ == '.

Я получаю liloMIA01 в качестве расшифрованного значения, я пытался использовать rtrim, но это не сработало.

1 Ответ

1 голос
/ 13 апреля 2010

Большая проблема с mcrypt заключается в том, что он не поддерживает какой-либо алгоритм заполнения при использовании с блочными шифрами, такими как 3DES. Таким образом, вы получите мусор в конце, если данные не кратны размеру блока (в данном случае 8 байтов).

Вам необходимо правильно заполнить данные с помощью pkcs # 5 или добавить поле длины.

...