openssl-enc
名称
openssl-enc - 对称密码例程
概要
openssl enc|cipher [-cipher] [-help] [-list] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a] [-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-iter count] [-pbkdf2] [-saltlen size] [-p] [-P] [-bufsize number] [-nopad] [-v] [-debug] [-none] [-engine id] [-rand files] [-writerand file] [-provider name] [-provider-path path] [-propquery propq]
openssl cipher [...]
描述
对称密码命令允许使用各种分组密码和流密码对数据进行加密或解密,使用基于密码或显式提供的密钥。Base64 编码或解码也可以单独执行,或者除了加密或解密之外还可以执行。
选项
- -cipher
-
要使用的密码。
- -help
-
打印使用信息。
- -list
-
列出所有支持的密码。
- -ciphers
-
-list 的别名,用于显示所有支持的密码。
- -in filename
-
输入文件名,默认情况下为标准输入。
- -out filename
-
输出文件名,默认情况下为标准输出。
- -pass arg
-
密码来源。有关 arg 格式的更多信息,请参阅 openssl-passphrase-options(1)。
- -e
-
加密输入数据:这是默认设置。
- -d
-
解密输入数据。
- -a
-
对数据进行 Base64 处理。这意味着如果正在进行加密,则数据将在加密后进行 Base64 编码。如果设置了解密,则输入数据将在解密之前进行 Base64 解码。
- -base64
-
与 -a 相同
- -A
-
如果设置了 -a 选项,则在一行上对数据进行 Base64 处理。
- -k password
-
用于从其派生密钥的密码。这是为了与 OpenSSL 的先前版本兼容。已被 -pass 参数取代。
- -kfile filename
-
从 filename 的第一行读取用于从其派生密钥的密码。这是为了与 OpenSSL 的先前版本兼容。已被 -pass 参数取代。
- -md digest
-
使用指定的摘要从密码创建密钥。默认算法为 sha-256。
- -iter count
-
在从密码派生加密密钥时,对密码使用给定次数的迭代。较高的值会增加暴力破解结果文件所需的时间。此选项启用使用 PBKDF2 算法派生密钥。
- -pbkdf2
-
使用 PBKDF2 算法,默认迭代次数为 10000,除非由 -iter 命令行选项另行指定。
- -saltlen
-
设置使用 -pbkdf2 选项时的盐长度。出于兼容性原因,默认值为 8 字节。当前最大值为 16 字节。如果未使用 -pbkdf2 选项,则忽略此选项并使用固定盐长度 8。在加密时使用的盐长度也必须在解密时使用。
- -nosalt
-
在密钥派生例程中不要使用盐。此选项 不应 使用,除非用于测试目的或与 OpenSSL 的旧版本兼容。
- -salt
-
在加密时使用盐(随机生成或使用 -S 选项提供),这是默认设置。
- -S salt
-
要使用的实际盐:这必须表示为十六进制数字字符串。如果在加密时使用此选项,则在解密期间需要再次使用完全相同的价值。此盐可能会被截断或零填充以匹配盐长度(参见 -saltlen)。
- -K key
-
要使用的实际密钥:这必须表示为仅包含十六进制数字的字符串。如果仅指定密钥,则必须使用 -iv 选项另外指定 IV。当同时指定密钥和密码时,将使用 -K 选项给出的密钥,并将从密码生成的 IV。指定密钥和密码都没有太大意义。
- -iv IV
-
要使用的实际 IV:这必须表示为仅包含十六进制数字的字符串。当仅使用 -K 选项指定密钥时,必须显式定义 IV。当使用其他选项之一指定密码时,IV 将从该密码生成。
- -p
-
打印出使用的密钥和 IV。
- -P
-
打印出使用的密钥和 IV,然后立即退出:不要进行任何加密或解密。
- -bufsize number
-
设置 I/O 的缓冲区大小。
- -nopad
-
禁用标准分组填充。
- -v
-
详细打印;显示有关 I/O 和缓冲区大小的一些统计信息。
- -debug
-
调试用于 I/O 的 BIO。
- -z
-
在加密后或解密前使用 zlib 压缩或解压缩加密数据。此选项仅在 OpenSSL 使用 zlib 或 zlib-dynamic 选项编译时存在。
- -none
-
使用 NULL 密码(不对输入进行加密或解密)。
- -rand files, -writerand file
-
有关详细信息,请参见 openssl(1) 中的“随机状态选项”。
- -provider name
- -provider-path path
- -propquery propq
- -engine id
-
请参阅 openssl(1) 中的“引擎选项”。此选项已弃用。
注意
该程序可以称为 openssl cipher
或 openssl enc -cipher
。第一种形式不适用于引擎提供的密码,因为这种形式是在读取配置文件和加载任何 ENGINE 之前处理的。使用 openssl-list(1) 命令获取支持密码的列表。
提供完全新的加密算法的引擎(例如,提供 gost89 算法的 ccgost 引擎)应在配置文件中配置。使用 -engine 选项在命令行上指定的引擎只能用于由 OpenSSL 内核或配置文件中指定的另一个引擎支持的密码的硬件辅助实现。
当 enc 命令列出支持的密码时,配置文件中指定的引擎提供的密码也会列出。
如果需要,将提示输入密码以派生密钥和 IV。
-salt 选项应 始终 使用,除非您希望与 OpenSSL 的先前版本兼容。如果从密码派生密钥。
如果没有 -salt 选项,则可以对密码执行有效的字典攻击,并攻击流密码加密数据。原因是,如果没有盐,相同的密码总是会生成相同的加密密钥。
当盐随机生成时(这意味着在使用密码加密时,没有使用 -S 选项给出显式盐),加密数据的头几个字节将被保留用于存储盐,以便以后解密。
有些密码没有很大的密钥,而另一些密码如果使用不当则会产生安全隐患。建议初学者只使用强大的分组密码,例如 AES,在 CBC 模式下。
所有分组密码通常使用 PKCS#5 填充,也称为标准分组填充。这允许执行基本完整性或密码检查。但是,由于随机数据通过测试的可能性大于 1/256,因此它不是一个很好的测试。
如果禁用填充,则输入数据必须是密码分组长度的倍数。
所有 RC2 密码具有相同的密钥和有效密钥长度。
Blowfish 和 RC5 算法使用 128 位密钥。
请注意,OpenSSL 3.0 改变了 -S 选项的效果。通过此选项指定的任何显式盐值不再在加密时预先添加到密文中,并且必须在解密时再次显式提供。相反,当在解密期间使用 -S 选项时,密文预计不会具有预先添加的盐值。
当使用 OpenSSL 3.0 或更高版本解密在 OpenSSL 1.1.1 下使用显式盐加密的数据时,不要使用 -S 选项,盐将从密文中读取。要生成可以使用 OpenSSL 1.1.1 解密的密文,不要使用 -S 选项,盐将被随机生成并预先添加到输出中。
支持的密码
请注意,其中一些密码可以在编译时禁用,而有些密码仅在配置文件中配置了适当的引擎时才可用。使用 -list 选项(即 openssl enc -list
)调用此命令时的输出是您的 OpenSSL 版本支持的密码列表,包括由已配置引擎提供的密码。
此命令不支持 CCM 和 GCM 等经过身份验证的加密模式,并且将来也不会支持这些模式。这是因为必须在验证身份验证标记之前开始流式传输输出(例如,当未使用 -out 时,流式传输到标准输出)。当此命令在管道中使用时,接收端将无法在身份验证失败时回滚。当前普遍使用的 AEAD 模式在密钥/iv/nonce 重用时也会遭受机密性和/或完整性的灾难性失败,并且由于 openssl enc 将密钥/iv/nonce 管理的全部责任放在用户身上,因此公开 AEAD 模式的风险太大了,无法允许。这些密钥/iv/nonce 管理问题也会影响此命令中当前公开的其他模式,但这些情况下的失败模式并不那么极端,并且功能不能在稳定的发布分支中删除。对于数据的批量加密,无论是使用经过身份验证的加密模式还是其他模式,都推荐使用 openssl-cms(1),因为它提供了一种标准的数据格式并执行所需的密钥/iv/nonce 管理。
当 enc 与密钥包装模式一起使用时,输入数据无法流式传输,这意味着它必须一次性处理。因此,输入数据大小必须小于缓冲区大小(-bufsize 参数,默认为 8*1024 字节)。'*-wrap' 密码要求输入长度为 8 字节的倍数,因为不涉及填充。'*-wrap-pad' 密码允许任何输入长度。在这两种情况下,都不需要 IV。请参见下面的示例。
base64 Base 64
bf-cbc Blowfish in CBC mode
bf Alias for bf-cbc
blowfish Alias for bf-cbc
bf-cfb Blowfish in CFB mode
bf-ecb Blowfish in ECB mode
bf-ofb Blowfish in OFB mode
cast-cbc CAST in CBC mode
cast Alias for cast-cbc
cast5-cbc CAST5 in CBC mode
cast5-cfb CAST5 in CFB mode
cast5-ecb CAST5 in ECB mode
cast5-ofb CAST5 in OFB mode
chacha20 ChaCha20 algorithm
des-cbc DES in CBC mode
des Alias for des-cbc
des-cfb DES in CFB mode
des-ofb DES in OFB mode
des-ecb DES in ECB mode
des-ede-cbc Two key triple DES EDE in CBC mode
des-ede Two key triple DES EDE in ECB mode
des-ede-cfb Two key triple DES EDE in CFB mode
des-ede-ofb Two key triple DES EDE in OFB mode
des-ede3-cbc Three key triple DES EDE in CBC mode
des-ede3 Three key triple DES EDE in ECB mode
des3 Alias for des-ede3-cbc
des-ede3-cfb Three key triple DES EDE CFB mode
des-ede3-ofb Three key triple DES EDE in OFB mode
desx DESX algorithm.
gost89 GOST 28147-89 in CFB mode (provided by ccgost engine)
gost89-cnt GOST 28147-89 in CNT mode (provided by ccgost engine)
idea-cbc IDEA algorithm in CBC mode
idea same as idea-cbc
idea-cfb IDEA in CFB mode
idea-ecb IDEA in ECB mode
idea-ofb IDEA in OFB mode
rc2-cbc 128 bit RC2 in CBC mode
rc2 Alias for rc2-cbc
rc2-cfb 128 bit RC2 in CFB mode
rc2-ecb 128 bit RC2 in ECB mode
rc2-ofb 128 bit RC2 in OFB mode
rc2-64-cbc 64 bit RC2 in CBC mode
rc2-40-cbc 40 bit RC2 in CBC mode
rc4 128 bit RC4
rc4-64 64 bit RC4
rc4-40 40 bit RC4
rc5-cbc RC5 cipher in CBC mode
rc5 Alias for rc5-cbc
rc5-cfb RC5 cipher in CFB mode
rc5-ecb RC5 cipher in ECB mode
rc5-ofb RC5 cipher in OFB mode
seed-cbc SEED cipher in CBC mode
seed Alias for seed-cbc
seed-cfb SEED cipher in CFB mode
seed-ecb SEED cipher in ECB mode
seed-ofb SEED cipher in OFB mode
sm4-cbc SM4 cipher in CBC mode
sm4 Alias for sm4-cbc
sm4-cfb SM4 cipher in CFB mode
sm4-ctr SM4 cipher in CTR mode
sm4-ecb SM4 cipher in ECB mode
sm4-ofb SM4 cipher in OFB mode
aes-[128|192|256]-cbc 128/192/256 bit AES in CBC mode
aes[128|192|256] Alias for aes-[128|192|256]-cbc
aes-[128|192|256]-cfb 128/192/256 bit AES in 128 bit CFB mode
aes-[128|192|256]-cfb1 128/192/256 bit AES in 1 bit CFB mode
aes-[128|192|256]-cfb8 128/192/256 bit AES in 8 bit CFB mode
aes-[128|192|256]-ctr 128/192/256 bit AES in CTR mode
aes-[128|192|256]-ecb 128/192/256 bit AES in ECB mode
aes-[128|192|256]-ofb 128/192/256 bit AES in OFB mode
aes-[128|192|256]-wrap key wrapping using 128/192/256 bit AES
aes-[128|192|256]-wrap-pad key wrapping with padding using 128/192/256 bit AES
aria-[128|192|256]-cbc 128/192/256 bit ARIA in CBC mode
aria[128|192|256] Alias for aria-[128|192|256]-cbc
aria-[128|192|256]-cfb 128/192/256 bit ARIA in 128 bit CFB mode
aria-[128|192|256]-cfb1 128/192/256 bit ARIA in 1 bit CFB mode
aria-[128|192|256]-cfb8 128/192/256 bit ARIA in 8 bit CFB mode
aria-[128|192|256]-ctr 128/192/256 bit ARIA in CTR mode
aria-[128|192|256]-ecb 128/192/256 bit ARIA in ECB mode
aria-[128|192|256]-ofb 128/192/256 bit ARIA in OFB mode
camellia-[128|192|256]-cbc 128/192/256 bit Camellia in CBC mode
camellia[128|192|256] Alias for camellia-[128|192|256]-cbc
camellia-[128|192|256]-cfb 128/192/256 bit Camellia in 128 bit CFB mode
camellia-[128|192|256]-cfb1 128/192/256 bit Camellia in 1 bit CFB mode
camellia-[128|192|256]-cfb8 128/192/256 bit Camellia in 8 bit CFB mode
camellia-[128|192|256]-ctr 128/192/256 bit Camellia in CTR mode
camellia-[128|192|256]-ecb 128/192/256 bit Camellia in ECB mode
camellia-[128|192|256]-ofb 128/192/256 bit Camellia in OFB mode
示例
仅对二进制文件进行 Base64 编码
openssl base64 -in file.bin -out file.b64
解码同一个文件
openssl base64 -d -in file.b64 -out file.bin
使用提示的密码和 PBKDF2 密钥派生加密文件,使用 AES-128
openssl enc -aes128 -pbkdf2 -in file.txt -out file.aes128
使用提供的密码解密文件
openssl enc -aes128 -pbkdf2 -d -in file.aes128 -out file.txt \
-pass pass:<password>
加密文件,然后对其进行 Base64 编码(以便可以通过邮件发送,例如),使用 AES-256 在 CTR 模式下,以及 PBKDF2 密钥派生
openssl enc -aes-256-ctr -pbkdf2 -a -in file.txt -out file.aes256
对文件进行 Base64 解码,然后使用文件中提供的密码对其进行解密
openssl enc -aes-256-ctr -pbkdf2 -d -a -in file.aes256 -out file.txt \
-pass file:<passfile>
AES 密钥包装
openssl enc -e -a -id-aes128-wrap-pad -K 000102030405060708090A0B0C0D0E0F -in file.bin
or
openssl aes128-wrap-pad -e -a -K 000102030405060708090A0B0C0D0E0F -in file.bin
错误
-A 选项在与大型文件一起使用时无法正常工作。
openssl enc 命令仅支持具有某些参数的固定数量的算法。因此,例如,如果您想使用带有 76 位密钥的 RC2 或带有 84 位密钥的 RC4,则无法使用此程序。
历史
默认摘要已从 OpenSSL 1.1.0 中的 MD5 更改为 SHA256。
-list 选项是在 OpenSSL 1.1.1e 中添加的。
-ciphers 和 -engine 选项在 OpenSSL 3.0 中被弃用。
-saltlen 选项是在 OpenSSL 3.2 中添加的。
版权
版权所有 2000-2023 OpenSSL 项目作者。保留所有权利。
根据 Apache 许可证 2.0 版(“许可证”)授权使用。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获取一份副本。