Php openssl_decrypt()函数不工作,返回null

Php openssl_decrypt()函数不工作,返回null,php,ssl,encryption,Php,Ssl,Encryption,我使用了openssl_encrypt和openssl_decrypt函数,但解密部分不返回任何值,而使用相同的密钥加密可以正常工作。 这是我使用的函数。变量$decrypted始终返回空值。 每一个小小的帮助都将被感激 function deCryption($value) { $methods = openssl_get_cipher_methods(); $clefSecrete = "flight"; echo '<pre>'; foreac

我使用了openssl_encrypt和openssl_decrypt函数,但解密部分不返回任何值,而使用相同的密钥加密可以正常工作。 这是我使用的函数。变量
$decrypted
始终返回空值。 每一个小小的帮助都将被感激

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;
}
函数解密($value)
{
$methods=openssl_get_cipher_methods();
$clefsecret=“航班”;
回声';
foreach($methods作为$method){
//$encrypted=openssl\u encrypt($textextearypter,$method,$clefsecret);——这是用于加密的
$decrypted=openssl\u decrypt($value,$method,$clefsecret);
echo“value=”.$decrypted;
echo$方法。“:”.$已解密。“\n”;
打破
}
回声';
返回$decrypted;
}

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

我发现解释官方php文档的缺点很有用。另一篇内容类似的文章是

最后,它归结为密钥/密码。openssl_加密库需要的是密钥而不是密码。密钥的大小必须是密码的固有密钥大小。第一篇文章说,如果您提供了一个较长的密钥,那么多余的密钥将被丢弃,一个比预期短的密钥将填充为零,即.\x00字节。我没有检验过这个事实

我已经编辑了你的代码,如下所示

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

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

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

$plaintext='测试OpenSSL函数';
$methods=openssl_get_cipher_methods();
//$clefsecret='flight';
回声';
foreach($methods作为$method){
$ivlen=openssl\u cipher\u iv\u length($method);
$clefsecret=openssl\u random\u pseudo\u字节($ivlen);
$iv=openssl_随机_伪_字节($ivlen);
$encrypted=openssl\u encrypt($plaintext,$method,$clefsecret,openssl\u RAW\u DATA,$iv);
$decrypted=openssl\u decrypt($encrypted,$method,$clefsecret,openssl\u RAW\u DATA,$iv);
回显“明文=”.$plaintext.“\n”;
echo“cipher=”.$method.“\n”;
echo“加密到:”.$encrypted.“\n”;
echo“已解密为:”.$decrypted.\n\n”;
}
回声';

它是否发出
E_警告
?确保在
错误报告(E\u ALL)中打开了警告openssl\u error\u string()
,code>可能会有所帮助;但它没有发出任何警告。这只是一个问题,问题已经三年了,作者在很长一段时间内都不会被看到。当你回答加密问题时,你打开了潘多拉魔盒,因为偶然发现这个答案的人会复制粘贴它。答案没有提到初始化向量的重要性,为什么每次加密数据时它都必须不同,诸如此类-我建议您也添加这些,以使答案完整。
    $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>';