PHP双向加密

时间:2013-08-04 12:17:28

标签: 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>';
}

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

1 个答案:

答案 0 :(得分:2)

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

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

MAC或经过身份验证的密码生成的身份验证数据称为身份验证标记。


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

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

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

免责声明:我没有读过这个组件部署的对称密码,而且我没有以任何方式测试过代码。