首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mcrypt处理数据

mcrypt处理数据
EN

Stack Overflow用户
提问于 2015-02-06 02:42:35
回答 1查看 156关注 0票数 2

我试图使用mcrypt制作一个加密/解密例程,但它似乎把我试图加密的数据搞砸了。

这是代码:

代码语言:javascript
复制
    $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“字符,所以我在解密后使用‘strtok’清除了它:

代码语言:javascript
复制
$decryptedData = \strtok( mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB), "\0" );
var_dump($decryptedData); //string 'Some important data' (length=19)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-06 04:25:54

这里缺少的是填充;必须首先填充要加密的数据:

代码语言:javascript
复制
$data = pkcs7_pad($data, 16);

同样,解密后需要反转填充:

代码语言:javascript
复制
$decryptedData = pkcs7_unpad($decryptedData, 16);

所使用的职能:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28357716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档