我试图了解openssl中2个加密模块之间的特殊区别。一个模块是" openssl enc"另一个是" openssl smime"。据我所知,SMIME通常用于电子邮件,而openssl enc用于通用加密/解密例程。我的困惑是openssl enc模块允许你指定一个键,一个初始化向量和一个salt,但openssl smime模块只允许你指定一个键。这是什么原因? smime模块是否承担引擎盖下的特定IV和盐?在这种情况下,我特别使用AES的CBC模式。
答案 0 :(得分:2)
这两个命令非常不同。
Openssl enc根据您的规格进行加密。因此,如果你想要aes-256-cbc,你可以说:
$ more foo.txt
The quick brown fox jumps over the lazy dog
$ openssl rand -hex 16
12b53ed0a13749832fe92d1e00f8b4db
$ openssl rand -hex 32
8cc103b653a10f0ea884482e4cdd0615160930e840d00af12e33ac560a830bd0
$ openssl enc -e -aes-256-cbc -in foo.txt -out foo.enc -K 8cc103b653a10f0ea884482e4cdd0615160930e840d00af12e33ac560a830bd0 -iv 12b53ed0a13749832fe92d1e00f8b4db
$ base64 foo.enc
7wiOhwD9WEm4h2Y9ooDFlEFPkIX6gU+6Xm6ca9P1t+z7S83Vk95WwOezSd2Hv2A1
$ openssl enc -d -aes-256-cbc -in foo.enc -K 8cc103b653a10f0ea884482e4cdd0615160930e840d00af12e33ac560a830bd0 -iv 12b53ed0a13749832fe92d1e00f8b4db
The quick brown fox jumps over the lazy dog
在此示例中,foo.txt长44个字节,加密消息为48个字节(3 *块长度,包括填充),因此这是原始AES加密数据。
Openssl smime根据S/MIME构建RFC 3447消息。这意味着,它使用hybrid encryption,其中实际消息是对称加密的,具有随机密钥和IV。 IV嵌入在消息中,然后使用您在命令行上指定的证书中的public key对密钥进行加密。如果要对消息进行签名,则私钥可以从-signer参数中的证书中获取,也可以直接从-inkey指定的文件中获取。
中,典型的openssl smime输出可能如下所示SEQUENCE(2 elem)
OBJECT IDENTIFIER 1.2.840.113549.1.7.3
[0](1 elem)
SEQUENCE(3 elem)
INTEGER 0
SET(1 elem)
# Certificate information, issuer and serial number
OCTET STRING(128 byte) 73CE9886... # RSA encrypted key
SEQUENCE(3 elem)
OBJECT IDENTIFIER1.2.840.113549.1.7.1
SEQUENCE(2 elem)
OBJECT IDENTIFIER2.16.840.1.101.3.4.1.2 # AES-128-CBC
OCTET STRING(16 byte) D2A3ECBAE792CFC19DD696AEF9593BB3 # random IV
[0](48 byte) A14F3F76... # encrypted message