4

OpenSSL の EVP インターフェイスを使用して、GCM モードを使用して AES 暗号化を実装しています。

現在、認証モードの 1 つである GCM は、暗号文の整合性を提供します。つまり、暗号文 (および提供されている場合は追加データ) にタグ (MAC - メッセージ認証コード) を生成します。このタグは、暗号化テキストが変更されていないことを確認するために、後で復号化する前にチェックできます。

このブログ投稿に従って暗号化を実装しました: http://incog-izick.blogspot.in/2011/08/using-openssl-aes-gcm.html

復号化中に、次の API 呼び出しを (この順序で) 使用しています。

    // setting cipher, key and iv
    EVP_DecryptInit (ctx, EVP_aes_128_gcm(), key, iv);

    // setting tag
    EVP_CIPHER_CTX_ctrl (ctx, EVP_CTRL_GCM_SET_TAG, taglength, tagbuffer);

    // adding Additional Authenticated Data (AAD)
    EVP_DecryptUpdate (ctx, NULL, &length, aad, aadlength);

    // decrypting data
    EVP_DecryptUpdate (ctx, decrypteddata, &length, encrypteddata, encryptedlength);

    // authentication step
    EVP_DecryptFinal(ctx, outbuffer, &length);

問題は、暗号テキストまたは AAD を変更すると、暗号テキストがまだ復号化され、復号化プロセスの最終呼び出し、つまり EVP_DecryptFinal の呼び出しでエラーが検出されることです。エラーを示すゼロ値が返されます。

私の意見では、エラーは EVP_DecryptUpdate 呼び出し自体でスローされ、復号化は失敗するはずです。遅いエラー検出は、認証された暗号化の目的を無効にします。

ここで何が問題なのですか?

4

1 に答える 1

3

暗号文の最後に到達する前に MAC が失敗することをどうやって知るのでしょうか? ストリーミング API は、最後に到達したことを認識する前に出力を生成する必要があります。

これを回避するには、メッセージ全体を一時バッファーに復号化し、生成されたプレーンテキストを使用して復号化が完了した場合にのみ実行します。暗号文が検証された場合にのみ暗号文を提供するAPI (NaCl などunbox) がありますが、それらはストリーミングの使用をサポートしていません。

あるいは、一定の間隔で MAC を暗号文に入れる新しい暗号化スキームを作成することもできます。これにより、これらの小さなブロックを復号化して検証することができます。プレーンな AES-GCM では十分ではありません。

于 2012-10-19T10:54:43.247 に答える