CCM (Счетчик с CBC-MAC) определен в RFC3610 . Реализация CCM с EVP, описанная в EVP_Authenticated_Encryption_and_Decryption , выглядит следующим образом:
Шифрование: при шифровании создается тег :
int ccm_encrypt(...){
...
/* Set tag length */
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, 14, NULL);
...
/* Get the tag */
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, 14, tag); // tag is generated here
...
}
Затем тег передается получателю вместе с зашифрованным текстом.
Расшифровка: во время расшифровки полученный тег используется для аутентификации:
int ccm_decrypt(...){
...
/* Set expected tag value. */
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, 14, tag); // tag is provided here
...
/* ...obtain the plaintext output...*/
ret = EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len); // tag is verified here
...
}
Расшифровка работает только в том случае, если тег, использованный при расшифровке, совпадает с тегом, созданным во время шифрования. В противном случае EVP_DecryptUpdate
возвращает 0 и предоставляет массив нулевых значений для расшифрованных данных.
Я не знаю, откуда исходит изображение, но IMO расшифровка AES-CCM с использованием EVP_aes_256_ccm()
не описана должным образом.
EDIT:
При использовании EVP_aes_256_ccm()
тег шифрования должен быть известен для дешифрования (как описано выше), поскольку дешифрование и аутентификация
выполняются в один шаг.
Конечно, дешифрование и аутентификация также могут выполняться в двух шагах: на первом шаге дешифрование выполняется с использованием AES-CTR, то есть определяются открытый текст и тег (CBC-MAC 1). На втором этапе тег (CBC-MAC 2) снова вычисляется из открытого текста с использованием CBC-MAC (как это было сделано во время процесса шифрования). Аутентификация успешна, если оба тега (CBC-MAC 1 и CBC-MAC 2) идентичны.
Однако, насколько мне известно, не существует EVP-методов, которые напрямую поддерживают этот подход. Тем не менее, СКК является лишь комбинацией
AES-CTR и CBC-MAC, которые объединены в соответствии с RFC3610 . По этой причине вы также можете реализовать CCM и использовать
Методы EVP, необходимые для AES-CTR и CBC-MAC:
- Для AES-256-CTR есть
EVP_aes_256_ctr()
.
- Для CBC-MAC необходим AES-256-CBC. Для этого есть
EVP_aes_256_cbc()
.
- Вот примеры CBC-шифрования и CBC-шифрования с использованием EVP-методов. Соответствующие EVP-методы для результата CTR
когда
EVP_aes_256_cbc()
заменено на EVP_aes_256_ctr()
.
- Определение CBC-MAC по сути является CBC-шифрованием, так что кроме
EVP_aes_256_cbc()
здесь не нужны другие EVP-методы.
Поскольку AES-CTR и AES-CBC уже реализованы в соответствующих EVP-методах, требуется больше усилий для форматирования ввода обоих механизмов. Хорошее описание можно найти в NIST Special Publication 800-38C . Следует отметить, что сегодня AES-GCM стал самым популярным режимом AE (AD), см., Например, этот пост .