所以我用这个类来加密或解密数据相同的结果:3DES PHP解密即使炭末增加
class CryptData
{
private $hash;
function __construct($hash) {
$key = md5($hash, true);
$key .= substr($key, 0, 8);
$this->hash = $key;
}
public function Encrypt($data)
{
$encData = openssl_encrypt($data, 'DES-EDE3', $this->hash, OPENSSL_RAW_DATA);
return base64_encode($encData);
}
public function Decrypt($data)
{
$data = base64_decode($data);
return openssl_decrypt($data, 'DES-EDE3', $this->hash, OPENSSL_RAW_DATA);
}
}
,它工作正常,但例如,如果我使用:
hash = 12345
text = 1234567891234567
并加密然后将其它导致
decData = LQ1zff + UiAAs6GXEgA5x6beMPOubhpcA
现在,如果我尝试解密这个数据传回纯文本,然后它给了我正确的结果,但即使我在decData像
decData = LQ1zff + UiAAs6GXEgA5x6beMPOubhpcAa
结尾处添加任何字符
令人惊讶的是给了正确的纯文本以及.. !! 我有什么后几个测试发现,decData没有“=”末,如果我增加一个字符,然后将解密没有错误的文本。 例如,如果我尝试
hash = 12345
text = 12345
那么它会导致
decData = CQM/ZBYSrrs =
现在,如果我解密在结束此增加一个字符那么它将是一个错误。
所以总结一下,当我尝试加密长度等于或大于16的文本时,解密数据中就没有'='。我没有任何问题与但如果我尝试解密的解密数据将在月底任何字符,它给了我正确的文本回来。
为什么这是可能的,并且这个问题对我的数据是否存在任何安全问题?