Ответ 1
Не отправлять hmac (сообщение), aes (message). Если вы отправляете одно и то же сообщение дважды, каждый может сказать. Кроме того, для предотвращения атак, таких как отступы оракула, вам нужно выполнить mac encrypt-text.
IV: В общем, простой способ борьбы с iv - это добавить его, поскольку он фиксировал длину, в текст шифрования. Затем вы можете просто прочитать эти байты перед расшифровкой. IV могут быть общедоступными, но они должны быть случайными.
HMAC: Самый простой способ, если ваша библиотека поддерживает его, - использовать AES в режиме GCM (или, что менее желательно, EAX). На самом деле это не HMAC, но он обеспечивает аутентифицированное шифрование, которое так же хорошо. Если они не поддерживаются:
Вам нужно вычислить hmac как для iv, так и для шифрованного текста. если || является конкатенацией (которую вы могли бы сделать с помощью копии массива при работе с байтовыми массивами), тогда вы хотите
CipherText = iv|| aes(key1,iv,message)
tag = hmac(key2,ciphertext)
И затем отправьте (tag, CipherText). С другой стороны, вы запускаете один и тот же вызов hmac для регенерации тега и сравнения полученного тега с вычисленным. Сравните хэши sha1 или sha256, а не напрямую, чтобы вы не просачивались там, где сравнение не удается.
Вы должны использовать другой ключ для hmac. На практике хватка суммы sha1 вашего ключа шифрования достаточно хороша.