Как получить информацию тега для расшифровки AES-CCM с помощью openssl - PullRequest
1 голос
/ 19 мая 2019

Я работаю над приложением безопасности, где оно использует режим AES-CCM.Требования к заявке приведены на рисунке.

enter image description here

Я был поражен расшифровкой, поскольку в моем приложении ожидается TAG, а также расшифровка.

В соответствии с openssl EVP Authenticated Encryption and Decryption , мы должны предоставить TAG вместе с длиной TAG, как показано ниже.

/* Set expected tag value. */
if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, 14, tag))
    handleErrors();

Если я не устанавливаю тегинформация, результат будет все нули.Я ознакомился с подробностями реализации AES-CCM по адресу e_aes.c в строке 3835 и обнаружил, что если ожидаемый тег совпадает с созданным тегом, обновляется только результат.(Это мое понимание)

Не могли бы вы предложить мне, как справиться с этой проблемой.

РЕДАКТИРОВАТЬ Я создал изображение на основетребование.На самом деле в клиентском коде они хранят значение TAG из шифрования и сравнивают с TAG, сгенерированным при описании.т.е. сравнение происходит в коде клиента.Поэтому мне нужно вернуть тег, сгенерированный в Decryption, к клиентскому коду.

1 Ответ

1 голос
/ 19 мая 2019

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), см., Например, этот пост .

...