PHP 双向加密

标签 php encryption

我需要能够加密和解密变量,但我还需要知道解密是否成功。在我的代码中,当我在解密之前将 $string 变量更改为其他内容时,我会收到随机字符。

function encrypt($string) {
    $key = 'password';
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
    return $encrypted;
}
function decrypt($encrypted) {
    $key = 'password';
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
    return $decrypted;
}

$string = 'Hello world.';
if (encrypt($string)) {
    $string = encrypt($string);
    echo $string;
    echo '<br>';
}

if (decrypt($string)) {
    $string = decrypt($string);
    echo $string;
    echo '<br>';
}

是否可以检测失败的解密? 谢谢。

最佳答案

检测密文篡改的最佳方法是在密文上添加 MAC(消息验证码)。这是由 key 生成的签名。用于此目的的 key 应该与用于执行加密的 key 不同。实现此目的的一种方法是在主 key 上使用 KDF( key 派生函数)来生成两个 key 。

或者,可以使用经过验证的密码,例如 GCM(伽罗瓦计数器模式)。

由 MAC 或经过验证的密码生成的验证数据称为验证标签。


您想要实现的目标的合理实现似乎嵌入在 Zend 框架中:

http://www.zimuel.it/en/english-cryptography-made-easy-with-zend-framework/

不要忘记将盐与密文一起检索和存储(加密后调用 getSalt(),解密期间使用 setSalt())。请注意,作者经常混淆 salt 和 IV 这两个词,这不是一个好兆头。

免责声明:我没有通读该组件部署的对称密码代码,也没有以任何方式测试该代码。

关于PHP 双向加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18042849/

相关文章:

javascript - 如何在 Codeigniter 中创建 API?

php - 如何在数字列表中显示第 N 个项目之后的项目

ruby - Ruby 中的 AES-256-GCM 加密和 Golang 解密

jenkins - jenkins可以ssh到另一个用户,但是pgp仍然认为它是jenkins用户

php - 在php中使用openssl_encrypt加密数据,然后在nodejs中解密数据 - 所需的 key 大小似乎不同?

php - Wordpress:自动更改 the_content 部分中的 URL

javascript - jQuery 对话框的问题

php - Active Collab SSL 相关错误

c++ - 如何使用 MS CryptoAPI 导出受密码保护的私钥?

java - 在 Python 中解密由 Java 以 3DES 加密的数据