mcrypt 弄乱数据
mcrypt messing with data
我正在尝试使用 mcrypt
创建一个 crypt/decrypt 例程,但它似乎弄乱了我试图加密的数据。
代码如下:
$data = 'Some important data';
$key = "mycryptKey";
$cipher = "rijndael-128";
$encryptedData = mcrypt_encrypt($cipher, $key, $data, MCRYPT_MODE_ECB);
$decryptedData = mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB);
var_dump($data); //string 'Some important data' (length=19)
var_dump($encryptedData); //string '™ì{*¾xv-&n5’Œü½Ýëc®n)mSƒ7]' (length=32)
var_dump($decryptedData); //string 'Some important data�������������' (length=32)
它一直在原始字符串的末尾添加这些字符。
我在 How do you Encrypt and Decrypt a PHP String? 看到了一个示例,但没有用
这就是实际测试。我使用的密钥和数据与此处发布的相同
编辑
我意识到,在@jonhopkins 发表评论后,mcrypt 在 $data 内容之后填充了一些“\0”字符,所以我在解密后使用 [=32= 清理了它]:
$decryptedData = \strtok( mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB), "[=11=]" );
var_dump($decryptedData); //string 'Some important data' (length=19)
你在这里缺少的是填充;要加密的数据必须先填充:
$data = pkcs7_pad($data, 16);
同样,解密后需要反转填充:
$decryptedData = pkcs7_unpad($decryptedData, 16);
使用的函数:
function pkcs7_unpad($data)
{
return substr($data, 0, -ord($data[strlen($data) - 1]));
}
function pkcs7_pad($data, $size)
{
$length = $size - strlen($data) % $size;
return $data . str_repeat(chr($length), $length);
}
此外,重要的是要注意 mcrypt 扩展相当陈旧且维护不善;我建议改用 OpenSSL。有关完整示例,请参阅我的 earlier answer。
我正在尝试使用 mcrypt
创建一个 crypt/decrypt 例程,但它似乎弄乱了我试图加密的数据。
代码如下:
$data = 'Some important data';
$key = "mycryptKey";
$cipher = "rijndael-128";
$encryptedData = mcrypt_encrypt($cipher, $key, $data, MCRYPT_MODE_ECB);
$decryptedData = mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB);
var_dump($data); //string 'Some important data' (length=19)
var_dump($encryptedData); //string '™ì{*¾xv-&n5’Œü½Ýëc®n)mSƒ7]' (length=32)
var_dump($decryptedData); //string 'Some important data�������������' (length=32)
它一直在原始字符串的末尾添加这些字符。 我在 How do you Encrypt and Decrypt a PHP String? 看到了一个示例,但没有用
这就是实际测试。我使用的密钥和数据与此处发布的相同
编辑
我意识到,在@jonhopkins 发表评论后,mcrypt 在 $data 内容之后填充了一些“\0”字符,所以我在解密后使用 [=32= 清理了它]:
$decryptedData = \strtok( mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB), "[=11=]" );
var_dump($decryptedData); //string 'Some important data' (length=19)
你在这里缺少的是填充;要加密的数据必须先填充:
$data = pkcs7_pad($data, 16);
同样,解密后需要反转填充:
$decryptedData = pkcs7_unpad($decryptedData, 16);
使用的函数:
function pkcs7_unpad($data)
{
return substr($data, 0, -ord($data[strlen($data) - 1]));
}
function pkcs7_pad($data, $size)
{
$length = $size - strlen($data) % $size;
return $data . str_repeat(chr($length), $length);
}
此外,重要的是要注意 mcrypt 扩展相当陈旧且维护不善;我建议改用 OpenSSL。有关完整示例,请参阅我的 earlier answer。