为了账号安全,请及时绑定邮箱和手机立即绑定

PHP AES加密/解密

/ 猿问

PHP AES加密/解密

开满天机 2019-07-31 18:40:33

PHP AES加密/解密

我在PHP中找到了en / decode字符串的示例。起初它看起来非常好,但它不会工作:-(


有谁知道问题是什么?


$Pass = "Passwort";

$Clear = "Klartext";


$crypted = fnEncrypt($Clear, $Pass);

echo "Encrypted: ".$crypted."</br>";


$newClear = fnDecrypt($crypted, $Pass);

echo "Decrypted: ".$newClear."</br>";


function fnEncrypt($sValue, $sSecretKey) {

    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, $sDecrypted, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));

}


function fnDecrypt($sValue, $sSecretKey) {

    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, base64_decode($sEncrypted), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));

}

结果是:


加密: boKRNTYYNp7AiOvY1CidqsAn9wX4ufz/D9XrpjAOPk8=


解密: —‚(ÑÁ   ^ yË~F'¸®Ó–í    œð2Á_B‰Â—


查看完整描述

3 回答

?
森栏

$sDecrypted并且$sEncrypted 在您的代码中未定义。查看有效的解决方案(但不安全!):


停!

这个例子不安全!不要用它!


$Pass = "Passwort";$Clear = "Klartext";        $crypted = fnEncrypt($Clear, $Pass);echo "Encrypred: ".$crypted."</br>";$newClear = fnDecrypt($crypted, $Pass);echo "Decrypred: ".$newClear."</br>";        function fnEncrypt($sValue, $sSecretKey){
    return rtrim(
        base64_encode(
            mcrypt_encrypt(
                MCRYPT_RIJNDAEL_256,
                $sSecretKey, $sValue, 
                MCRYPT_MODE_ECB, 
                mcrypt_create_iv(
                    mcrypt_get_iv_size(
                        MCRYPT_RIJNDAEL_256, 
                        MCRYPT_MODE_ECB                    ), 
                    MCRYPT_RAND)
                )
            ), "\0"
        );}function fnDecrypt($sValue, $sSecretKey){
    return rtrim(
        mcrypt_decrypt(
            MCRYPT_RIJNDAEL_256, 
            $sSecretKey, 
            base64_decode($sValue), 
            MCRYPT_MODE_ECB,
            mcrypt_create_iv(
                mcrypt_get_iv_size(
                    MCRYPT_RIJNDAEL_256,
                    MCRYPT_MODE_ECB                ), 
                MCRYPT_RAND            )
        ), "\0"
    );}


查看完整回答
反对 回复 2019-07-31
?
慕哥9229398


如果您不想对 15行代码中可解决的内容使用重依赖,请使用内置的OpenSSL函数。大多数PHP安装都附带OpenSSL,它在PHP中提供快速,兼容和安全的AES加密。嗯,只要您遵循最佳实践,它就是安全的。


以下代码:


在CBC模式下使用AES256

与其他AES实现兼容,但不兼容mcrypt,因为mcrypt使用PKCS#5而不是PKCS#7。

使用SHA256从提供的密码生成密钥

生成加密数据的hmac哈希以进行完整性检查

为每条消息生成随机IV

将IV(16字节)和散列(32字节)预先添加到密文

应该非常安全

IV是一个公共信息,每个消息都需要随机。哈希确保数据未被篡改。


function encrypt($plaintext, $password) {

    $method = "AES-256-CBC";

    $key = hash('sha256', $password, true);

    $iv = openssl_random_pseudo_bytes(16);


    $ciphertext = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv);

    $hash = hash_hmac('sha256', $ciphertext, $key, true);


    return $iv . $hash . $ciphertext;

}


function decrypt($ivHashCiphertext, $password) {

    $method = "AES-256-CBC";

    $iv = substr($ivHashCiphertext, 0, 16);

    $hash = substr($ivHashCiphertext, 16, 32);

    $ciphertext = substr($ivHashCiphertext, 48);

    $key = hash('sha256', $password, true);


    if (hash_hmac('sha256', $ciphertext, $key, true) !== $hash) return null;


    return openssl_decrypt($ciphertext, $method, $key, OPENSSL_RAW_DATA, $iv);

}

用法:


$encrypted = encrypt('Plaintext string.', 'password'); // this yields a binary string


echo decrypt($encrypted, 'password');

// decrypt($encrypted, 'wrong password') === null


查看完整回答
反对 回复 2019-07-31

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信