Не удается расшифровать файл CTR Blowfish с помощью Pycryptodome - PullRequest
0 голосов
/ 02 мая 2018

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

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

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

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 Ответ

0 голосов
/ 03 мая 2018

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

  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)

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

ПРИМЕЧАНИЕ: blowfish.py шифрует на машинах с прямым порядком байтов иначе, чем на младших.

...