【问题标题】:openssl_decrypt () function not working, returning nullopenssl_decrypt() 函数不工作,返回 null
【发布时间】:2013-08-10 03:58:04
【问题描述】:

我使用了 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;
}

【问题讨论】:

  • 它会发出E_WARNING吗?确保您已使用 error_reporting(E_ALL); 打开警告
  • 如果您也使用openssl_error_string() 可能会有所帮助。
  • 我尝试打开 error_reporting(E_ALL);但它不会发出警告。它只是发送空白

标签: php ssl encryption


【解决方案1】:

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

我发现this article 有助于解释官方 php 文档的缺点。另一篇类似内容的文章是here

最后归结为密钥/密码。 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>';

【讨论】:

  • 这个问题已经 3 岁了,作者很长一段时间都不会出现在 SO 上。虽然您确实回答了有关加密的问题,但您打开了潘多拉魔盒,因为偶然发现此答案的人会复制粘贴它。答案没有提到初始化向量的重要性,为什么每次加密数据时它都必须不同等等 - 我建议你也添加它,以使答案完整。
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多