为什么 mysql AES 初始化向量长度总是限制在 16 个字节,即使我选择 aes-256-cbc 模式?在这种情况下不应该是 32 吗?
Why mysql AES initialization vector length is always limited to 16 bytes, even if I choose aes-256-cbc mode? Shuldn't it be 32 in this case?
我在 MySQL8.0 服务器上设置了 block_encryption_mode=aes-256-cbc。
mysql 8.0 手册说:
For modes that require the optional init_vector argument, it must be
16 bytes or longer (bytes in excess of 16 are ignored).
我对 CBC 模式块密码的理解是初始化向量应该和密钥一样大,即在我的例子中是 32 字节。维基百科证实了这一点:
To initiate this process, an additional input value is required to be
mixed with the first block, and which is referred to as an
initialization vector. For example, the cipher-block chaining (CBC)
mode requires an unpredictable value of the cipher's block size as
additional input, ...
我已经验证 mysql 忽略了第 16 个字节之后的所有内容,使用简单的查询
SELECT AES_ENCRYPT(UNHEX('0000000000000000000000000000000000000000000000000000000000000000'),UNHEX('0000000000000000000000000000000000000000000000000000000000000000'),UNHEX('0000000000000000000000000000000000000000000000000000000000000000'))
产生与
相同的结果
SELECT AES_ENCRYPT(UNHEX('0000000000000000000000000000000000000000000000000000000000000000'),UNHEX('0000000000000000000000000000000000000000000000000000000000000000'),UNHEX('0000000000000000000000000000000000000000000000000000000000000001'))
因为 Mysql 用零填充密钥中任何缺失的字节,我想它对 IV 也是如此。
这不是削弱了加密吗?您是否知道任何其他强制使用 128 位 IV 且与密码块大小无关的 AES 实现?
AES 块大小始终为 128 位(16 字节),但它接受不同的密钥大小(128/196/256 位)。
顺便说一句,Rijndael 可以使用 256 位块大小,但它的传播范围并不广。
我在 MySQL8.0 服务器上设置了 block_encryption_mode=aes-256-cbc。
mysql 8.0 手册说:
For modes that require the optional init_vector argument, it must be 16 bytes or longer (bytes in excess of 16 are ignored).
我对 CBC 模式块密码的理解是初始化向量应该和密钥一样大,即在我的例子中是 32 字节。维基百科证实了这一点:
To initiate this process, an additional input value is required to be mixed with the first block, and which is referred to as an initialization vector. For example, the cipher-block chaining (CBC) mode requires an unpredictable value of the cipher's block size as additional input, ...
我已经验证 mysql 忽略了第 16 个字节之后的所有内容,使用简单的查询
SELECT AES_ENCRYPT(UNHEX('0000000000000000000000000000000000000000000000000000000000000000'),UNHEX('0000000000000000000000000000000000000000000000000000000000000000'),UNHEX('0000000000000000000000000000000000000000000000000000000000000000'))
产生与
相同的结果SELECT AES_ENCRYPT(UNHEX('0000000000000000000000000000000000000000000000000000000000000000'),UNHEX('0000000000000000000000000000000000000000000000000000000000000000'),UNHEX('0000000000000000000000000000000000000000000000000000000000000001'))
因为 Mysql 用零填充密钥中任何缺失的字节,我想它对 IV 也是如此。
这不是削弱了加密吗?您是否知道任何其他强制使用 128 位 IV 且与密码块大小无关的 AES 实现?
AES 块大小始终为 128 位(16 字节),但它接受不同的密钥大小(128/196/256 位)。
顺便说一句,Rijndael 可以使用 256 位块大小,但它的传播范围并不广。