即使最后添加了char,3DES PHP也会解密相同的结果

时间:2017-07-25 21:20:53

标签: php encryption 3des

所以我使用这个类来加密或解密数据:

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

令人惊讶的是它也提供了正确的纯文本.. !! 经过几次测试后我注意到了,没有' ='最后,如果我添加一个字符,那么它将解密为文本而不会出错。 例如,如果我尝试

hash = 12345
text = 12345

然后它将导致

  

decData = CQm / ZBYSrrs =

现在,如果我解密这个,最后添加一个字符,那么这将是一个错误。

总而言之,当我尝试加密长度= 16或更长的文本时,那么没有' ='在解密的数据中。我没有遇到任何问题,但如果我尝试解密解密数据,最后添加任何字符,它会给我正确的文本。

为什么这可能,这个问题对我的数据有任何安全问题吗?

1 个答案:

答案 0 :(得分:1)

Base64 用于将二进制数据编码为文本,其中每个 Base64 字符代表6位。每3个字节(24位)的输入提供4个 Base64 字符。如果输入长度不是3的多个,则Base64的最后一个块用一个或两个'='填充

Base64 编码数据需要包含4个 Base64 字符,才能生效 Base64 。似乎php的echo strlen(base64_decode("LQ1zff+UiAAs6GXEgA5x6beMPOubhpcA")); echo "\n"; echo strlen(base64_decode("LQ1zff+UiAAs6GXEgA5x6beMPOubhpcAa")); 只是忽略了你最后一个无效的 Base64 字符。您可以使用以下代码查看此内容:

24
24

,并提供:

matrix with image