2017-07-25 103 views
0

所以我用这个类来加密或解密数据相同的结果: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的文本时,解密数据中就没有'='。我没有任何问题与但如果我尝试解密的解密数据将在月底任何字符,它给了我正确的文本回来。

为什么这是可能的,并且这个问题对我的数据是否存在任何安全问题?

回答

1

Base64用于将二进制数据编码为文本,其中每个Base64字符表示6位。输入的各3个字节(24位),得到4- 的Base64字符。在输入长度不是3的多梅的情况下的Base64的最后的块是填充有一个或两个“=”

的Base64编码数据需要在4个的Base64字符块有效的Base64。看来,PHP的base64_decoder(..)只是忽略了你最后的无效Base64字符。你可以用下面的代码看到这一点:

echo strlen(base64_decode("LQ1zff+UiAAs6GXEgA5x6beMPOubhpcA")); 
echo "\n"; 
echo strlen(base64_decode("LQ1zff+UiAAs6GXEgA5x6beMPOubhpcAa")); 

,并提供:

24 
24