Я работаю над реализацией протокола и в соответствии со спецификацией, мне нужно шифровать / дешифровать данные с использованием AES-128-CCM и AES-128-GCM. Мой вопрос: как вы используете режим CCM при указании Cipher # auth_data ? Все примеры, которые я нахожу онлайн, используют режим GCM, который работает, а CCM - нет. Исключение, с которым я сталкиваюсь, очень обобщенное c OpenSSL::Cipher::CipherError
без каких-либо дополнительных подробностей.
Пример кода, приведенный ниже, работает, когда algo
является одним из вариантов (AES-128-CCM или AES-128- GCM), и никакие auth_data не равны nil
, или когда al go является AES-128-GCM, а auth_data не является nil
.
Я использую Ruby v2.5.5 и OpenSSL v2.1.2.
algo = 'AES-128-CCM' # AES-128-GCM works
auth_data = OpenSSL::Random.random_bytes(32) # nil works
cipher = OpenSSL::Cipher.new(algo).encrypt
if algo == 'AES-128-CCM'
cipher.auth_tag_len = 16
cipher.iv_len = 11
elsif algo == 'AES-128-GCM'
cipher.iv_len = 12
end
key = cipher.random_key
iv = cipher.random_iv
# has to be done in this order for unknown reasons
if algo == 'AES-128-CCM'
encrypted = cipher.update('Hello World') + cipher.final
cipher.auth_data = auth_data unless auth_data.nil?
elsif algo == 'AES-128-GCM'
cipher.auth_data = auth_data unless auth_data.nil?
encrypted = cipher.update('Hello World') + cipher.final
end
auth_tag = cipher.auth_tag
cipher = OpenSSL::Cipher.new(algo).decrypt
if algo == 'AES-128-CCM'
cipher.auth_tag_len = 16
cipher.iv_len = 11
elsif algo == 'AES-128-GCM'
cipher.iv_len = 12
end
cipher.key = key
cipher.iv = iv
cipher.auth_tag = auth_tag
cipher.update(encrypted) # crashes when auth_data != nil and algo == AES-128-CCM