我想通过使用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)
非常感谢。
答案 0 :(得分:1)
库defines the nonce 作为计数器块中未递增的部分。
由于该块只有64位长,因此很难安全地定义该随机数应为多长时间, 考虑到有回绕的危险(如果加密大量块)或随机数重用(如果随机生成随机数)。
您可以改为确定不存在随机数,计数器将使用完整的64位和随机初始值。
iv = get_random_bytes(8)
cipher = DES.new(key, nonce=b'', initial_value=iv)
最后,我想这只是一个练习。 DES是一个非常弱的密码,密钥长度仅为56位,块大小仅为64位。 改用AES。
答案 1 :(得分: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)