【发布时间】:2022-04-29 07:33:14
【问题描述】:
我正在尝试使用 AES cbc 128 加密字符串,但每次都遇到这个问题
self._cipher = factory.new(key,args, kwargs)ValueError: IV must be 16 bytes long
我正在使用 pycrypto 库,这是我的代码,
import base64
from Crypto.Cipher import AES
def pad(m):
return m+chr(16-len(m)%16)*(16-len(m)%16)
msg = \'Hello there I am new in Python\'
ciph = AES.new(\"asdfghjkl\", AES.MODE_CBC, \"asdfghjkl\")
enc = ciph.encrypt(pad(msg))
base = base64.b64encode(enc)
print (base)
每当我将密钥和 IV 长度更改为 16 位时,它都可以工作......但我只想用这个密钥和 IV 加密字符串,即 \"asdfghjkl\"
我见过很多在线网站都使用任何密钥、IV 长度以相同的方式加密字符串……但我没有弄清楚……它是如何工作的>
提前致谢。
-
根据定义,AES 使用 16 字节的 IV 和 16、24 或 32 字节的密钥大小。这是无法改变的。
-
这正是我已经回答的:不,这是不可能的,除非像链接网站那样作弊。一个简单的测试表明,对于 AES,太短的密钥会以 0x00 的值默默地扩展到 16 个字节,这是对无效密钥的错误处理,而且绝不是一个很好的例子(就像大多数在线加密网站一样)。
-
以同样的方式延长太短的IV。
-
@Topaco 请注意,AES 不使用任何 IV,它是使用的操作模式。 AES/GCM 通常使用 12 字节的 IV。另请注意,IV必须对于 AES-CBC 是不可预测/随机的,因此将考虑用零扩展 IV不安全. Mike211,加密/解密的想法是让数据保密。只是让它工作不应该是你的目标。这些 f*\'ed 网站所做的完全是随机的,而且通常是不安全的。不要混淆位/字节。
-
@MaartenBodewes - 这个问题是关于 AES/CBC 的,这里 IV 的大小等于 AES 定义为 16 字节的块大小。关于安全性:我根本没有进入这一点,但感谢您的补充。请注意,除了 IV,使用 0x00 值扩展的密钥也必须被认为是不安全的。
标签: python python-3.x encryption aes password-encryption