无法使用pycryptodome

时间:2018-05-02 13:01:22

标签: python-2.7 pycrypto blowfish pycryptodome

我正在尝试恢复使用旧的纯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)

我能找到的唯一建议是在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 :(得分:2)

首先,一些警告:

  1. 根据今天的标准,河豚不是一种安全的密码。使用AES。
  2. 计数器模式(CTR)不安全,因为它未检测到加密数据的恶意修改。使用其他模式,如GCM,CCM或EAX。
  3. 计数器模式确实需要为每条消息提供随机IV。但是,您使用的是固定的IV固定,非常错误
  4. 要回答您的问题,您应该将密码初始化为:

    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对象记录在案here。它允许定义一个小端计数器(通常CTR是big-endian)。

    注意:blowfish.py在big-endian机器上加密的方式与在little-endian机器上加密的方式不同。