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