Ruby Сбой OpenSSL AES-128-CCM с auth_data - PullRequest
1 голос
/ 28 марта 2020

Я работаю над реализацией протокола и в соответствии со спецификацией, мне нужно шифровать / дешифровать данные с использованием 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

1 Ответ

1 голос
/ 28 марта 2020

Вы изменили порядок данных аутентификации и открытого текста в своем вызове для CCM.

encrypted = cipher.update('Hello World') + cipher.final
cipher.auth_data = auth_data unless auth_data.nil?

В общем, дополнительные данные, прошедшие аутентификацию, должны обрабатываться перед данными в виде открытого текста. Есть некоторые хитрости вокруг этого для GCM (которые могут быть реализованы или нет), но не для CCM. Режим EAX допускает любой порядок аргументов, так как он был явно сделан, чтобы быть более гибкой реализацией шифра аутентификации.

...