我对以下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);
}
因此,例如,如果我使用salt / key'yBevuZoMy'加密字符串'liloMIA01',我将获得'7A30ZkEjYbDcAXLgGE / 6nQ =='。
我将liloMIA01作为解密值,我尝试使用rtrim但它不起作用。
答案 0 :(得分:1)
mcrypt的一个大问题是它与3DES等分组密码一起使用时不支持任何填充算法。因此,如果数据不是块大小的倍数(在这种情况下为8字节),那么最终会得到垃圾。
您需要使用pkcs#5正确填充数据或添加长度字段。