Использование режима 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)

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

Всего 2 ответа


bs = DES.block_size
plen = bs - len(plaintext) % bs
padding = [plen] * plen
padding = pack('b' * plen, *padding)
key = get_random_bytes(8)
nonce = Random.get_random_bytes(4)
ctr = Counter.new(32, prefix=nonce)
cipher = DES.new(key, DES.MODE_CTR,counter=ctr)
ciphertext = cipher.encrypt(plaintext+padding)

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

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

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

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

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


Есть идеи?

10000