Расшифровка AES GCM с Python без тега аутентификации - PullRequest
1 голос
/ 14 февраля 2020

Я начну с заявления об отказе от ответственности, что я здесь вне своей глубины. Коллега показывал мне процедуру расшифровки, которую он написал с pycryptodomex. У него был зашифрованный файл, ключ и одноразовый номер (извлеченный из файла). Он смог расшифровать содержимое файла очень простым способом.

c = Crypto.Cipher.AES.new(key, AES.MODE_GCM, nonce)
c.decrypt(encrypted_data)

Подобную реализацию вы можете увидеть в pycryptodome test для GCM:

cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96)

pt = get_tag_random("plaintext", 16 * 100)
ct = cipher.encrypt(pt)

cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96)
pt2 = cipher.decrypt(ct)

К сожалению, pycryptdomex - это дополнительная зависимость, которую мне нужно было бы отнести, и я стараюсь избежать этого. У меня есть базовая установка Anaconda, которая включает в себя пакеты pyCrypto и pyCA / cryptography . Похоже, что pycryptodomex - это форк pyCrytpo, у которого не было стабильной реализации GCM с самого начала. Когда я смотрю на реализацию для PyCA/cryptography, она смотрит прямо вперед:

cipher = Cipher(algorithms.AES(key), modes.GCM(nonce), backend=default_backend())
d = cipher.decryptor()

Но когда мы хотим расшифровать контент, мы должны вызвать finalize_with_tag и создать тег аутентификации:

d.update(encrypted_data) + d.finalize_with_tag(tag)

К сожалению, у меня нет тега аутентификации и я не знаю, где его найти. Я не могу установить значение None, так как существует требование минимальной длины. Я также не уверен, зачем мне сначала создавать тег аутентификации для расшифровки AES GCM с помощью PyCA/Cryptography, но мне не нужно создавать тег при дешифровании с помощью pycryptodomex. В конечном счете я ищу ясности в следующем:

  1. Возможно ли реализовать расшифровку AES / GCM с помощью пакета Anaconda PyCA/cryptography, если у меня есть доступ только к ключу, nonce, а зашифрованные данные?

  2. Почему мне нужно предоставить тег аутентификации для расшифровки с одной реализацией, а не с другой?

  3. pycryptodomex выполняет что-то под капот для определения метки?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020
  1. GCM без тега аутентификации соответствует режиму CTR. (кроме разницы +1 в значении начального счетчика)

  2. Вызов расшифровки не проверяет тег (насколько я знаю). Вы можете проверить это самостоятельно, изменив зашифрованный текст только одним байтом. Он будет прекрасно расшифровываться (до обычного текста, отключенного на один байт). Используйте decrypt_and_verify (см. test_invalid_mac тест).

  3. См. 2.

0 голосов
/ 14 февраля 2020

Извинения, поскольку я не могу отвечать на комментарии. Можно ли извлечь тег из расшифрованных данных после расшифровки? Этот PR , связанный с PyCA/cryptography, похоже, подразумевает точный сценарий, рассмотренный здесь.

Согласно GCM spe c (раздел 7.2: «Алгоритм функции аутентифицированного дешифрования»), сам тег не нужен до тех пор, пока зашифрованный текст не будет расшифрован.

Успешно ли выполняется d.update(encrypted_data) расшифровка данных, а d.finalize() требуется только для проверки целостности данных?

...