7

我使用了 openssl_encrypt 和 openssl_decrypt 函数,但解密部分没有返回任何值,而使用相同的密钥 Encrypt 工作正常。这是我使用的功能。该变量$decrypted始终返回 null 。每一个小小的帮助都将不胜感激

function deCryption($value)
{

    $methods = openssl_get_cipher_methods();
    $clefSecrete = "flight";
    echo '<pre>';
    foreach ($methods as $method) {
        //$encrypted = openssl_encrypt($texteACrypter, $method, $clefSecrete); ----this was used for encryption
        $decrypted = openssl_decrypt($value, $method, $clefSecrete);
        echo "value=".$decrypted;
        echo $method . ' : '. $decrypted . "\n";
        break;
    }
    echo '</pre>';
    return $decrypted;
}
4

1 回答 1

6

我遇到了完全相同的问题,然后我用谷歌搜索了我的问题并最终来到这里,我问的是同样的问题。所以我不得不在别处寻找。

我发现这篇文章有助于解释官方 php 文档的缺点。另一篇类似内容的文章在这里

最后归结为密钥/密码。openssl_encrypt 库所期望的是密钥而不是密码。并且密钥的大小必须是密码的固有密钥大小的大小。第一篇文章说,如果您提供更长的密钥,多余的将被丢弃,并且比预期短的密钥用零填充,即 \x00 字节。我没有测试过这个事实。

我已将您的代码编辑为如下所示。

我使用的想法是密码期望的初始向量的大小也是它期望的密钥的大小。所以在这里,我传递的是一个密钥而不是你所做的密码。只需找到一种将您的密码变成密钥的方法。

在您的代码中,您没有传递选项和 iv(初始化向量)。

iv 是密码在加密之前与明文“混合”的字符串。所以密码加密的是这种“混合物”。这很重要吗?是的!如果没有这种“混合”,一对相同的明文将产生一对相同的密文,这可能导致攻击;如果两个相同的明文-密文对不是来自同一个用户,那么这两个用户使用的是相同的密钥!因此,每个明文的唯一 iv 确保没有两个明文导致相同的密文。换句话说, iv 是一种salt

    $plaintext = 'Testing OpenSSL Functions';
    $methods = openssl_get_cipher_methods();
    //$clefSecrete = 'flight';
    echo '<pre>';       
    foreach ($methods as $method) {
        $ivlen = openssl_cipher_iv_length($method);
        $clefSecrete = openssl_random_pseudo_bytes($ivlen);
        $iv = openssl_random_pseudo_bytes($ivlen);

        $encrypted = openssl_encrypt($plaintext, $method, $clefSecrete, OPENSSL_RAW_DATA, $iv);
        $decrypted = openssl_decrypt($encrypted, $method, $clefSecrete, OPENSSL_RAW_DATA, $iv);
        echo 'plaintext='.$plaintext. "\n";
        echo 'cipher='.$method. "\n";
        echo 'encrypted to: '.$encrypted. "\n";
        echo 'decrypted to: '.$decrypted. "\n\n";
    }
    echo '</pre>';
于 2016-09-17T18:06:04.563 回答