Не удается расшифровать файл CTR Blowfish с помощью Pycryptodome

Я пытаюсь восстановить файл, зашифрованный старой чистой реализацией Python Blowfish.

старый код опирался на один файл blofish.py (Copyright (C) 2002 Майкл Гилфикс)

Старые данные зашифрованы, выполняя следующие операции:

cipher = Blowfish(self.masterKey)
cipher.initCTR()
cleanData = cipher.decryptCTR(encData)

Этот код не инициализирует одноразовый номер, который требуется в современной реализации blowfish, поэтому я не смог перенести его на функцию pycryptodome

cipher = Blowfish.new(self.masterKey, Blowfish.MODE_CTR, nonce = ?????)
cleanData = cipher.decrypt(encData)

Единственное предложение, которое я могу найти, находится внутри функции initCTR, где iv имеет значение 0 (даже если в режиме CTR нет IV)

def initCTR(self, iv=0):
  """Initializes CTR mode of the cypher"""
  assert struct.calcsize("Q") == self.blocksize()
  self.ctr_iv = iv
  self._calcCTRBUF()

def _calcCTRBUF(self):
  """Calculates one block of CTR keystream"""
  self.ctr_cks = self.encrypt(struct.pack("Q", self.ctr_iv)) # keystream block
  self.ctr_iv += 1
  self.ctr_pos = 0

Кто-нибудь может мне помочь?

1 ответ

Решение

Сначала несколько предупреждений:

  1. Blowfish не является безопасным шифром по сегодняшним стандартам. Используйте AES.
  2. Режим счетчика (CTR) небезопасен, поскольку он не обнаруживает злонамеренную модификацию зашифрованных данных. Используйте другие режимы, такие как GCM, CCM или EAX.
  3. Режим счетчика действительно требует случайного IV для каждого сообщения. Тем не менее, вы используете фиксированный IV, что очень неправильно.

Чтобы ответить на ваш вопрос, вы должны инициализировать шифр следующим образом:

from Crypto.Util import Counter

ctr = Counter.new(64, initial_value=0, little_endian=True)
cipher = Blowfish.new(self.masterKey, Blowfish.MODE_CTR, counter=ctr)

Счетчик объект задокументирован здесь. Это позволяет определить счетчик с прямым порядком байтов (обычно CTR является байтовым порядком байтов).

НОТА: blowfish.py шифрует по-другому на машинах с прямым порядком байтов, чем на машинах с прямым порядком байтов.

Другие вопросы по тегам