Я использую интерфейсы OpenSSL EVP для реализации шифрования AES в режиме GCM.
Теперь 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, и расшифровка должна завершиться неудачно. Позднее обнаружение ошибок сводит на нет цель аутентифицированного шифрования.
В чем проблема?