PyCryptoDome / неравенство криптографии с AES-CFB в python - PullRequest
2 голосов
/ 13 января 2020

Выполняя тест, чтобы убедиться, что две разные библиотеки дают одинаковый вывод, я обнаружил, что они не имеют CFB. Код для воспроизведения проблемы:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from Crypto.Cipher import AES

KEY = b'legoroojlegorooj'
IV = b'legoroojlegorooj'

aes = Cipher(algorithms.AES(KEY), modes.CFB(IV), default_backend()).encryptor()
output_data = aes.update(b'Feathers fall as fast as bowling balls.') + aes.finalize()
del aes


ctr = AES.new(KEY, AES.MODE_CFB, iv=IV)
output_data2 = ctr.encrypt(b'Feathers fall as fast as bowling balls.')

assert output_data == output_data2  # AssertionError

Любая помощь в решении этой проблемы будет оценена.

Этот код работает с modes.OFB(IV) и AES.MODE_OFB.

1 Ответ

2 голосов
/ 13 января 2020

В режиме CFB необходимо указать размер регистра сдвига, при этом разные библиотеки часто используют разные значения по умолчанию. Для различия размер сдвигового регистра в битах часто добавляется к CFB, т.е. CFB8 использует сдвиговый регистр 8 битов, а CFB128 - сдвиговый регистр 128 битов.

Криптография имеет два варианта CFB8 и CFB128, где последний просто называется CFB. PyCryptodome позволяет устанавливать целочисленные кратные 8 битам, используя параметр segment_size со значением по умолчанию 8 бит.

То есть в текущем коде Криптография использует CFB128, а PyCryptodome использует CFB8 (значение по умолчанию), что приводит к различным результатам.

Работают следующие комбинации:

  • PyCryptodome с segment_size=128 и Криптография с CFB. Оба соответствуют CFB128:

    # CFB with a 128 bit shift-register
    # Output as hex-string: 63230751cc1efe25b980d9e707396a1a171cd413e6e77f1cd7a2d3deb2217255a36ae9cbf86c66
    ...
    aes = Cipher(algorithms.AES(KEY), modes.CFB(IV), default_backend()).encryptor()
    ...
    ctr = AES.new(KEY, AES.MODE_CFB, iv=IV, segment_size=128)
    ...
    
  • PyCryptodome с segment_size=8 (значение по умолчанию) и Криптография с CFB8. Оба соответствуют CFB8:

    # CFB with a 8 bit shift-register
    # Output as hex-string: 63d263889ffe94dd4740580067ee798da474c567b8b54319a5022650085c62674628f7c9e790c3
    ...
    aes = Cipher(algorithms.AES(KEY), modes.CFB8(IV), default_backend()).encryptor()
    ...
    ctr = AES.new(KEY, AES.MODE_CFB, iv=IV, segment_size=8)
    ...
    

Обратите внимание, что (1) обе библиотеки Python обеспечивают идентичный результат для режима OFB , поскольку обе используют OFB128 , (2) CFB128 быстрее, чем CFB8: в CFB8 шифрование AES должно вызываться 16 раз для каждого блока против 1 раза в CFB128.

...