Я пытаюсь восстановить файл, зашифрованный с помощью старой реализации blowfish на чистом Python.
старый код опирался на единственный файл 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
Кто-нибудь может мне помочь?
Сначала несколько предупреждений:
Чтобы ответить на ваш вопрос, вы должны инициализировать шифр как:
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
на машинах с прямым порядком байтов шифрует иначе, чем на машинах с прямым порядком байтов.
Я только что заметил, что blowfish.sh использует для счетчика нативный порядок байтов, и, скорее всего, ваши данные были зашифрованы в режиме прямого порядка байтов (CTR обычно считается в режиме прямого порядка байтов). Поэтому вам необходимо использовать Crypto.Util.Counter.
со счетчиком работает как шарм. Пришло время перейти на безопасный шифр
Сказать, что режим CTR небезопасен, - неискренне, поскольку модель угроз может или не требовать аутентификации. Также режим CTR можно безопасно использовать в зашифрованной, а затем MAC-среде. Примечание: я вообще не сторонник режима CTR. Также во многих случаях режимы GCM, CCM или EAX недоступны.
Только режим @zaph CTR является «безопасным с множеством если». Среднестатистический разработчик имеет высокую вероятность выстрелить себе в ногу, значительно меньше с GCM / GCM / EAX.
ИМО «Среднестатистический разработчик» имеет практически нулевой шанс использовать криптографические примитивы для создания безопасной системы. Лучше всего использовать хорошо проверенные библиотеки, которые охватывают весь процесс, включая создание IV / счетчика, аутентификацию и получение ключей, такие как libsodium, RNCryptor, NaCl и т. д.
Идея заключалась в том, чтобы расшифровать контент, а затем зашифровать его с помощью AES. Ваше решение работает только частично ... оно правильно расшифровывает первые 8 символов, но затем вывод неверен: результат: B8-CA-3A½ø0h £ B3Æ «- ожидание: B8-CA-3A-7E-F0-23