Не удается расшифровать файл 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 ответ
Сначала несколько предупреждений:
- Blowfish не является безопасным шифром по сегодняшним стандартам. Используйте AES.
- Режим счетчика (CTR) небезопасен, поскольку он не обнаруживает злонамеренную модификацию зашифрованных данных. Используйте другие режимы, такие как GCM, CCM или EAX.
- Режим счетчика действительно требует случайного 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
шифрует по-другому на машинах с прямым порядком байтов, чем на машинах с прямым порядком байтов.