PHP mcrypt_decrypt。两个不同字符串的结果相同

时间:2016-03-04 16:06:55

标签: php mcrypt

我正在使用mcrypt_encrypt / decrypt创建一个代码通过URL传递的优惠券。

public function getReservationIdFromHash($hash) {
    $base64Hash = pack('H*',$hash);
    $encrypted = base64_decode($base64Hash);
    $key = pack("H*", '0123456789abcdef0123456789abcdef');
    $iv =  pack("H*", "abcdef9876543210abcdef9876543210");
    $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
    return $str;    
}

public function encodeCode($code) {

    $key = pack("H*", '0123456789abcdef0123456789abcdef');
    $iv =  pack("H*", "abcdef9876543210abcdef9876543210");
    $cypherText = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $code, MCRYPT_MODE_CBC, $iv);
    $base64 = base64_encode($cypherText);
    $arr = unpack('H*',$base64);
    $dev = array_pop($arr);
    return $dev;       
}

但是我遇到了一个奇怪的问题,因为这个加密代码(这是我的功能的结果):

785738496771754c66595869566d73446970667444413d3d

和此:

785738496771754c66595869566d73446970667444413d3d44

始终解码为:“XXXXXXXXXXX”(我用来测试的字符串),但我的常识告诉我,它们不应该被解码为完全相等的字符串。

我认为我做错了什么,但我无法想象是什么。

由于

1 个答案:

答案 0 :(得分:1)

显示$encrypted,你可能会看到同样的事情。

简而言之:如果您为加密/解密功能提供相同(且有效)的输入,您将获得相同的输出。在这种情况下,两个输入必须不相同。

两者看起来都像是Base64编码数据的十六进制显示。

第一个输出是24个ASCII字符
xW8IgquLfYXiVmsDipftDA==
第二个输出是25个ASCII字符
xW8IgquLfYXiVmsDipftDA==D

第一个以ASCII ==结尾,只能在Base64编码结束时发生。第二个以ASCII ==D结尾。我的猜测是Base64解码在==处停止并忽略其他字符,因为这只能发生在Base64编码值的末尾。

第二个长度也不是有效的Base64长度,Base64编码总是4个字节的倍数,末端填充为0,1或2个=个字符。