围绕这个话题有很多问题,但我还没有找到一个问题来解释我的问题。
我使用AES 128 CBC加密数据,但使用python和pycryptodome (应该使用python,但找不到它),并指定密钥和iv (通常是随机的)。所以,钥匙没有盐渍。
当我尝试在... | openssl enc -aes128 -d -K <key> -iv <initialization vector>中使用OpenSSL1.1.0g时,该操作在解密大部分字符串后出现“数字信封”失败。如果我加上‘-nopad’,那么它就完全工作了,没有错误。输出差为11个字节。
在加密前,将原始输入与二进制0填充为16字节的倍数,将加密的字符串转换为十六进制,然后对十六进制iv进行预处理,并对所有内容进行base64编码。
有人能解释一下为什么我需要-nopad选项吗?我认为使用-K和-iv选项,openssl根本不会处理salt进行解密。
发布于 2019-03-11 22:28:39
根据man enc的说法:
所有块密码通常使用PKCS#5填充,也称为标准块填充。
PKCS#5填充 (在这里技术上是PKCS#7 )是通过将N个字节的值N添加到明文中来完成的,这样它就可以被块大小平均整除。如果不指定-nopad,enc就会期望,例如,30字节的明文将被加密为32字节的密文,最后2个明文字节的值为2。
PKCS#5填充要求始终至少有一个填充字节,因此在最坏的情况下,您将有一个完整的填充块,但好处是,在解密最后一个字节时,始终可以检查需要删除多少填充。这防止了填充和数据之间的任何模糊。
在您的示例中,您已经用值0的字节填充了明文,这会导致解密错误。这称为零填充或null填充,通常不使用,因为如果数据可以包含空字节,就不可能区分填充和数据。当使用-nopad时,enc将要求输入在加密时被块大小均匀地除以,并且解密时不会试图去除任何填充,让您自己处理它(这就是为什么要获得这11个额外字节)。
正如@dave_thompson_085所指出的,只有enc在使用密码时才会使用salt来派生密钥和IV。当直接指定IV和密钥时,不存在salt。
https://security.stackexchange.com/questions/205189
复制相似问题