OpenSSL

密码学和 SSL/TLS 工具包

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

请参阅 openssl(1) 中的“提供者选项”provider(7)property(7)

-engine id

请参阅 openssl(1) 中的“引擎选项”。此选项已弃用。

注意

该程序可以称为 openssl cipheropenssl 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 中获取一份副本。