Использование режима CTR в алгоритме DES (в python) - PullRequest
0 голосов
/ 13 октября 2018

Я хочу использовать режим CTR в алгоритме DES в python с помощью пакета PyCryptodome.Мой код представлен в конце этого поста.Однако я получил эту ошибку: «Ошибка типа: невозможно создать безопасный одноразовый номер для коротких блоков».Стоит отметить, что этот код хорошо работает для алгоритма 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 ]

0 голосов
/ 15 октября 2018

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

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

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

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

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

0 голосов
/ 14 октября 2018
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)
...