Использование режима CTR в алгоритме DES (в python)

Я хочу использовать режим CTR в алгоритме DES в python с помощью пакета PyCryptodome. Мой код представлен в конце этого поста. Однако я получил эту ошибку: «TypeError: невозможно создать безопасный одноразовый номер для коротких блоков». Стоит отметить, что этот код хорошо работает для алгоритма AES, но не работает для DES, DES3, Blowfish и т. д. (с размером блока 64). Насколько мне известно, режим CTR можно применять в алгоритмах 64-блочного шифрования.

from Crypto.Cipher import DES
from Crypto.Random import get_random_bytes
data = b'My plain text'
key = get_random_bytes(8)
cipher = DES.new(key, DES.MODE_CTR)
ct_bytes = cipher.encrypt(data)
nonce = cipher.nonce
cipher = DES.new(key, DES.MODE_CTR, nonce=nonce)
pt = cipher.decrypt(ct_bytes)
print("The message was: ", pt)

Большое спасибо.


person AI_Eng    schedule 12.10.2018    source источник
comment
Режим CTR технически работает для 64-битных блочных шифров, но авторы этой библиотеки считают его небезопасным. Повторный счетчик для одного и того же ключа — это катастрофа для безопасности, и это слишком легко сделать с 64-битным блочным шифром.   -  person President James K. Polk    schedule 14.10.2018
comment
Спасибо. Я разместил здесь код, который работает, но вы правы.   -  person AI_Eng    schedule 14.10.2018


Ответы (1)


Библиотека определяет одноразовый номер как часть блока счетчика, который не увеличивается.

Поскольку блок имеет длину всего 64 бита, трудно надежно определить, какой длины должен быть этот одноразовый номер, учитывая опасность переноса (если вы шифруете много блоков) или повторного использования одноразового номера (если вы генерируете одноразовый номер случайным образом).

Вместо этого вы можете решить, что одноразовый номер отсутствует, счетчик принимает полные 64 бита и случайное начальное значение.

iv = get_random_bytes(8)
cipher = DES.new(key, nonce=b'', initial_value=iv)

Наконец, я думаю, что это только упражнение. DES — очень слабый шифр с длиной ключа всего 56 бит и размером блока всего 64 бита. Вместо этого используйте AES.

person SquareRootOfTwentyThree    schedule 15.10.2018