我想通过使用PyCryptodome包在python的DES算法中使用CTR模式。我的代码在这篇文章的末尾呈现。但是我收到此错误:"类型错误:无法为短块大小创建安全随机数"。值得一提的是,此代码适用于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)
多谢。
库定义了随机数 作为计数器块中未递增的部分。
由于块只有 64 位长,因此很难安全地定义随机数应该有多长, 考虑到环绕(如果您加密大量块(或随机数重用(如果您随机生成随机数(的危险。
相反,您可以决定随机数不存在,计数器采用完整的 64 位和一个随机初始值。
iv = get_random_bytes(8)
cipher = DES.new(key, nonce=b'', initial_value=iv)
最后,我想这只是一个练习。 DES 是一种非常弱的密码,密钥长度仅为 56 位,块大小仅为 64 位。 请改用 AES。
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)