我正在使用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”(我用来测试的字符串),但我的常识告诉我,它们不应该被解码为完全相等的字符串。
我认为我做错了什么,但我无法想象是什么。
由于
答案 0 :(得分:1)
显示$encrypted
,你可能会看到同样的事情。
简而言之:如果您为加密/解密功能提供相同(且有效)的输入,您将获得相同的输出。在这种情况下,两个输入必须不相同。
两者看起来都像是Base64编码数据的十六进制显示。
第一个输出是24个ASCII字符
xW8IgquLfYXiVmsDipftDA==
,
第二个输出是25个ASCII字符
xW8IgquLfYXiVmsDipftDA==D
。
第一个以ASCII ==
结尾,只能在Base64编码结束时发生。第二个以ASCII ==D
结尾。我的猜测是Base64解码在==
处停止并忽略其他字符,因为这只能发生在Base64编码值的末尾。
第二个长度也不是有效的Base64长度,Base64编码总是4个字节的倍数,末端填充为0,1或2个=
个字符。