首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图理解/使用openssl进行解密

试图理解/使用openssl进行解密
EN

Security用户
提问于 2019-03-11 21:44:58
回答 1查看 761关注 0票数 0

围绕这个话题有很多问题,但我还没有找到一个问题来解释我的问题。

我使用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进行解密。

EN

回答 1

Security用户

发布于 2019-03-11 22:28:39

根据man enc的说法:

所有块密码通常使用PKCS#5填充,也称为标准块填充。

PKCS#5填充 (在这里技术上是PKCS#7 )是通过将N个字节的值N添加到明文中来完成的,这样它就可以被块大小平均整除。如果不指定-nopadenc就会期望,例如,30字节的明文将被加密为32字节的密文,最后2个明文字节的值为2。

PKCS#5填充要求始终至少有一个填充字节,因此在最坏的情况下,您将有一个完整的填充块,但好处是,在解密最后一个字节时,始终可以检查需要删除多少填充。这防止了填充和数据之间的任何模糊。

在您的示例中,您已经用值0的字节填充了明文,这会导致解密错误。这称为零填充或null填充,通常不使用,因为如果数据可以包含空字节,就不可能区分填充和数据。当使用-nopad时,enc将要求输入在加密时被块大小均匀地除以,并且解密时不会试图去除任何填充,让您自己处理它(这就是为什么要获得这11个额外字节)。

正如@dave_thompson_085所指出的,只有enc在使用密码时才会使用salt来派生密钥和IV。当直接指定IV和密钥时,不存在salt。

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/205189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档