Используя API CNG для Windows, я могу зашифровать и дешифровать отдельные блоки данных с помощью аутентификации, используя AES в режиме GCM. Теперь я хочу зашифровать и дешифровать несколько буферов в строке.
Согласно документации для CNG, поддерживается следующий сценарий:
Если входные данные для шифрования или дешифрования разбросаны по нескольким буферов, то вы должны связать вызовы с BCryptEncrypt и Функции BCryptDecrypt. Цепочка указывается установкой BCRYPT_AUTH_MODE_IN_PROGRESS_FLAG в члене dwFlags.
Если я правильно ее понимаю, это означает, что я могу последовательно вызывать BCryptEncrypt
на несколько буферов, чтобы получить тег аутентификации для комбинированных буферов в конце. Аналогично, я могу последовательно вызывать BCryptDecrypt
на нескольких буферах, откладывая фактическую проверку подлинности до конца. Я не могу заставить это работать, но похоже, что значение для dwFlags
игнорируется. Всякий раз, когда я использую BCRYPT_AUTH_MODE_IN_PROGRESS_FLAG
, я получаю возвращаемое значение 0xc000a002
, которое равно STATUS_AUTH_TAG_MISMATCH
, как определено в ntstatus.h
.
Несмотря на то, что параметр pbIV
отмечен как in/out, элементы, на которые указывает параметр pbIV
, не изменяются BCryptEncrypt()
. Это ожидалось? Я также посмотрел поле pbNonce
в структуре BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO
, на которое указывает указатель pPaddingInfo
, но этот тоже не изменяется. Я также попытался "вручную" продвинуть IV, изменив содержимое сам по схеме счетчика, но это тоже не помогло.
Какова правильная процедура для цепочки функций BCryptEncrypt
и/или BCryptDecrypt
?