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 呼び出し自体でスローされ、復号化は失敗するはずです。遅いエラー検出は、認証された暗号化の目的を無効にします。
ここで何が問題なのですか?