加密解密 PHP 时出错


Error on encrypt-decrypt PHP

我尝试创建两个功能,一个用于加密参数,另一个用于解密它们,但我遇到了问题。有时,当我尝试解密任何单词/数字时,解密失败。只是有时,所以,我不知道哪个可能是错误。如果有人想检查我的函数,将发布它们:

function url_base64_decode($str){
return base64_decode(strtr($str,
    array(
    '.' => '+',
    '-' => '=',
    '~' => '/'
    )
));
}
function url_base64_encode($str){
    return strtr(base64_encode($str),
        array(
            '+' => '.',
            '=' => '-',
            '/' => '~'
        )
    );
}
function mdecrypt($input){
    $key = '4oF9B2NWXbmvIC5nNLLTbnmr5knkEBNBcrJt9m3xM3kjFyCZc3QAZbolXomtaIQSBBDDxxxAAAjTPV';
    $input = trim(chop($this->url_base64_decode($input)));
    $td = mcrypt_module_open ('tripledes', '', 'ecb', '');
    $key = substr(md5($key),0,24);
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
    mcrypt_generic_init ($td, $key, $iv);
    $decrypted_data = mdecrypt_generic ($td, $input);
    mcrypt_generic_deinit ($td);
    mcrypt_module_close ($td);
    return trim(chop($decrypted_data));
}
function mencrypt($input) {
    $key = '4oF9B2NWXbmvIC5nNLLTbnmr5knkEBNBcrJt9m3xM3kjFyCZc3QAZbolXomtaIQSBBDDxxxAAAjTPV';
    $key = substr(md5($key),0,24);
    $td = mcrypt_module_open ('tripledes', '', 'ecb', '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
    mcrypt_generic_init ($td, $key, $iv);
    $encrypted_data = mcrypt_generic ($td, $input);
    mcrypt_generic_deinit ($td);
    mcrypt_module_close ($td);
    return trim(chop($this->url_base64_encode($encrypted_data)));
}

我创建了一个循环来加密数字,例如,数字 63 在解密时失败:

  • 加密 : pECnbC3qkwg- 解密 : 60
  • 加密 : yOo70iZ7LKk- 解密 : 61
  • 加密 : GRkGYosxwO4- 解密 : 62
  • 加密 : AJGJzNep3YU- 解密 : +ÕϤȿß
  • 加密 : wvT3n6F~xkU- 解密 : 64
  • 加密 : 7p.gxcfLFcE- 解密 : 65

有人知道我该怎么办吗?

谢谢大家

问题键派生代码:

$key = substr(md5($key),0,24);

您正在尝试从 MD5 创建 24 字节密钥,但 MD5 仅提供 16 字节哈希,最后 8 字节年龄将未定义。最后 8 个字节可能会幸运地结束相同,但这不能保证,所以有时它有效,有时它不起作用。

最好的建议是使用为您完成所有这些工作的库,好的选择包括:

  • 化解
  • RNCryptor-php

笔记:

3DES不应该在新的工作中使用,使用AES。不要使用ECB模式,它不安全,使用带有随机iv的CBC模式,将iv附加到加密数据进行解密。不要使用 MD5 进行密码派生,请使用 PBKDF2。

ECB 模式不使用 iv,为什么要创建一个?