7

私はopenssl_encryptとopenssl_decrypt関数を使用しましたが、復号化部分は値を返しませんが、同じキー暗号化を使用すると正常に動作します。これが私が使用した機能です。変数$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 は、暗号化の前に暗号が平文と「混合」する文字列です。暗号が暗号化するのは、この「混合物」です。これは重要ですか?はい!この「混合」がなければ、同一の平文のペアが同一の暗号文のペアになり、攻撃につながる可能性があります。2 つの同一の平文と暗号文のペアが同じユーザーのものでない場合、これら 2 人のユーザーは同じ鍵を使用しています! したがって、平文ごとに固有の iv により、2 つの平文が同一の暗号文になることはありません。つまり、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 に答える