0

我正在尝试恢复使用河豚的旧纯 python 实现加密的文件。

旧代码依赖于单个 blofish.py 文件(版权所有 (C) 2002 Michael Gilfix )

旧数据被加密执行以下操作:

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

该代码没有初始化河豚的现代实现所需的随机数,因此我无法将其移植到 pycryptodome 函数

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

我能找到的唯一建议是在 iv 设置为 0 的 initCTR 函数内部(即使 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

有人能帮我吗?

4

1 回答 1

2

首先,几个警告:

  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.pybig-endian 机器的加密方式与 little-endian 机器的加密方式不同。

于 2018-05-03T08:08:22.333 回答