Поздняя аутентификация в расшифровке OpenSSL GCM

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

В чем проблема?


person sg1    schedule 19.10.2012    source источник


Ответы (1)


Как он узнает, что MAC выйдет из строя, прежде чем достигнет конца зашифрованного текста? Потоковому API необходимо произвести вывод до того, как он узнает, что достиг конца.

Чтобы избежать этого, расшифруйте все сообщение во временный буфер, и только после того, как вы закончите расшифровывать работу с созданным открытым текстом. Существуют API-интерфейсы (например, NaCl unbox), которые выдают вам зашифрованный текст только после его проверки, но они не поддерживают использование потоковой передачи.

В качестве альтернативы вы можете создать новую схему шифрования, которая помещает MAC-адреса через равные промежутки времени в зашифрованный текст, что позволяет вам расшифровывать и проверять эти более мелкие блоки. Простого AES-GCM для этого недостаточно.

person CodesInChaos    schedule 19.10.2012
comment
Спасибо за ответ, но когда я попытался реализовать CCM с использованием интерфейсов EVP, все заработало отлично. Расшифровка не удалась, если зашифрованный текст был изменен. Какая разница между двумя? - person sg1; 22.10.2012