1

我想通过使用 PyCryptodome 包在 python 中的 DES 算法中使用 CTR 模式。我的代码出现在这篇文章的末尾。但是我收到了这个错误:“TypeError:不可能为短块大小创建一个安全的随机数”。值得一提的是,此代码适用于 AES 算法,但不适用于 DES、DES3、Blowfish 等(64 块大小)。据我所知,CTR 模式可以应用于 64 块密码算法。

from Crypto.Cipher import DES
from Crypto.Random import get_random_bytes
data = b'My plain text'
key = get_random_bytes(8)
cipher = DES.new(key, DES.MODE_CTR)
ct_bytes = cipher.encrypt(data)
nonce = cipher.nonce
cipher = DES.new(key, DES.MODE_CTR, nonce=nonce)
pt = cipher.decrypt(ct_bytes)
print("The message was: ", pt)

非常感谢。

4

2 回答 2

2

该库将 nonce 定义 为计数器块中未递增的部分。

由于块只有 64 位长,因此很难安全地定义该 nonce 应该多长,因为存在回绕(如果您加密很多块)或 nonce 重用(如果您随机生成 nonce)的危险。

相反,您可以决定不存在随机数,计数器采用完整的 64 位和随机初始值。

iv = get_random_bytes(8)
cipher = DES.new(key, nonce=b'', initial_value=iv)

最后,我想这只是一个练习。DES 是一种非常弱的密码,密钥长度只有 56 位,块大小只有 64 位。请改用 AES。

于 2018-10-15T08:28:56.797 回答
0
bs = DES.block_size
plen = bs - len(plaintext) % bs
padding = [plen] * plen
padding = pack('b' * plen, *padding)
key = get_random_bytes(8)
nonce = Random.get_random_bytes(4)
ctr = Counter.new(32, prefix=nonce)
cipher = DES.new(key, DES.MODE_CTR,counter=ctr)
ciphertext = cipher.encrypt(plaintext+padding)
于 2018-10-14T12:53:22.880 回答