3

これが私のコードです:

<?php
$secret="This is a secret message.";
$key="Secret key.";
$iv=openssl_random_pseudo_bytes(12);
$method="aes-256-gcm";

$encrypted=openssl_encrypt($secret,$method,$key,false,$iv);
$decrypted=openssl_decrypt($encrypted,$method,$key,false,$iv);

echo $encrypted;
echo "<br>";
echo $decrypted;
?>

暗号化されたメッセージを取得しましたが、復号化しても結果もエラー メッセージも表示されません。同じコードが、aes-256-cbc などの別の方法で機能しています。

4

1 に答える 1

2

私のシステム (return OpenSSL 1.0.1 を内部的に使用する PHP 5.3.10) で彼をテストすると、平文 (メッセージ) と同じ長さの暗号文が返されます。

これは、GCM 暗号化が認証タグを返さず、内部 CTR モード暗号化のみを返すことを意味します。これは、PHP ラッパーが OpenSSL インターフェイスを直接呼び出すだけで、次のコードを使用していないことが原因である可能性があります。

if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag))
    handleErrors();

これは、GCM を使用した OpenSSL EVP (「高レベル」) 暗号化のサンプル コードで見つかりました。つまり、タグを個別に取得する必要があります。

タグを個別に処理することは、実際には理にかなっています - より少ないバッファリングを使用するよりオンラインの実装を作成することを可能にします - しかし、それはここでは役に立ちません. AES-CBC に続いて IV および暗号文を介した HMAC を使用して、GCM モードを置き換えることができます。暗号化と認証タグに別のキーを使用すると、この方式がいくらか安全になります。


PS初期化の違いにより、CTRモードの復号化を直接使用して平文を再度取得することはできません。

于 2015-02-15T17:26:38.627 に答える