openssl-enc
名称
openssl-enc – symmetric cipher routines
概要
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] [-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
指定使用的算法,cipher替换为具体的算法名字
-
-help
Print out a usage message.
-
-list
列出所支持的算法
-
-ciphers
同-list
-
-in filename
如果未指定此选项,则标准输入读取数据。
-
-out filename
如果不指定,则写入标准输出
-
-pass arg
密码源
-
-e
加密输入的数据
-
-d
解密输入的数据
-
-a
Base64 对数据进行处理。这意味着如果正在进行加密,则数据在加密后将进行 Base64 编码。如果设置了解密,则输入数据在解密之前将进行 Base64 解码。
当未指定 -A 选项时,编码时每 64 个字符后会插入一个换行符,解码时输入的前 1024 个字节中应有一个换行符。
-
-base64
同-a
-
-A
If the -a option is set then base64 encoding produces output without any newline character, and base64 decoding does not require any newlines. Therefore it can be helpful to use the -A option when decoding unknown input.
如果设置了 -a 选项,则 base64 编码会产生不带任何换行符的输出,而 base64 解码也不需要任何换行符。在解码未知输入时使用 -A 选项。 -
-k password
直接指定密码,为了兼容旧版本,新版用-pass
-
-kfile filename
从文件中读取密码,新版用-pass
-
-md digest
从passphrase创建密钥所用的摘要算法,默认是sha-256
-
-iter count
在导出加密密钥时对密码使用给定的迭代次数。较高的值会增加暴力破解所需的时间。此选项允许使用 PBKDF2 算法来导出密钥。
-
-pbkdf2
使用 PBKDF2 算法,默认迭代次数为 10000,除非 -iter 命令行选项另有规定。
-
-saltlen
设置使用 -pbkdf2 选项时要使用的盐长度。出于兼容性原因,默认值为 8 字节。最大值目前为 16 字节。如果不使用 -pbkdf2 选项,则忽略此选项并使用固定盐长度 8。解密时也必须使用加密时使用的盐长度。
-
-nosalt
不要在密钥派生例程中使用盐。除了测试目的或与旧版本的 OpenSSL 兼容外,不应使用此选项。
-
-salt
Use salt (randomly generated or provide with -S option) when encrypting, this is the default.
加密的时候使用salt(随机生成或通过-S选项指定),这是默认选项 -
-S salt
实际使用的盐:必须以十六进制数字字符串表示。如果在加密时使用此选项,则解密时将再次需要相同的精确值。
-
-K key
实际使用的加密密钥:必须用仅包含十六进制数字的字符串表示。如果仅指定key,则必须使用 -iv 选项指定 IV。当同时指定key和password时,将使用 -K 选项给出的key,并采用从password生成的 IV。同时指定密钥和密码没有多大意义。
-
-iv IV
实际使用的 IV:必须将其表示为仅由十六进制数字组成的字符串。当仅使用 -K 选项指定密钥时,必须明确定义 IV。当使用其他选项之一指定密码时,IV 将从此密码生成。
-
-p
打印key和IV
-
-P
打印出使用的 key 和 IV,然后立即退出:不进行任何加密或解密。
-
-bufsize number
设置I/O缓存区大小
-
-nopad
禁用块填充
-
-v
Verbose打印;显示一些有关 I/O 和缓冲区大小的统计信息。
-
-debug
Debug the BIOs used for I/O.
-
-z
在加密后或解密前使用 zlib 压缩或解压缩加密数据。仅当使用 zlib 或 zlib-dynamic 选项编译 OpenSSL 时才存在此选项。
-
-none
使用NULL算法(不执行加密或解密)
-
-rand files, -writerand file
See “Random State Options” in openssl(1) for details.
-
-provider name
-
-provider-path path
-
-propquery propq
See “Provider Options” in openssl(1), provider(7), and property(7).
-
-engine id
See “Engine Options” in openssl(1). This option is deprecated.
注意
该程序可以通 openssl cipher or openssl enc –cipher 命令来调用(cipher是算法名称)。第一种形式不适用于引擎提供的密码,因为此形式在读取配置文件和加载任何 ENGINE 之前进行处理。使用 openssl-list(1) 命令获取受支持的密码列表。
应在配置文件中配置提供全新加密算法的引擎(例如提供 gost89 算法的 ccgost 引擎)。使用 -engine 选项在命令行上指定的引擎只能用于硬件辅助实现的密码,这些密码由 OpenSSL 核心或配置文件中指定的其他引擎支持。
当使用openssl enc -list列出受支持的密码时,配置文件中指定的引擎提供的密码也会列出。
如果需要,将提示输入密码以派生Key和 IV。
如果密钥是从密码派生的,则应始终使用 -salt 选项,除非您希望与以前版本的 OpenSSL 兼容。
如果没有 -salt 选项,则有可能对密码执行有效的字典攻击,并攻击流密码加密数据。原因是如果没有盐,相同的密码总是会生成相同的加密密钥。
当salt是随机生成时(没有使用 -S 选项给出明确盐),加密数据的第一个字节被保留以存储盐以供以后解密。
有些密码没有大密钥,而其他密码如果使用不当则会产生安全隐患。建议初学者在 CBC 模式下仅使用strong block cipher,例如 AES。
所有block ciphers通常都使用 PKCS#5 填充,也称为standard block填充。这允许执行基本的完整性或密码检查。但是,由于随机数据通过测试的概率大于 256 分之一,因此这不是一个很好的测试。
如果禁用填充,则输入数据必须是密码块长度的倍数。
所有 RC2 密码都具有相同的密钥和有效密钥长度。
Blowfish 和 RC5 算法使用 128 位密钥。
请注意,OpenSSL 3.0 改变了 -S 选项的效果。通过此选项指定的任何显式盐值在加密时不再添加到密文前面,并且在解密时必须再次显式提供。相反,当在解密期间使用 -S 选项时,密文预计不会有前面插入的盐值。
使用 OpenSSL 3.0 或更高版本解密在 OpenSSL 1.1.1 下使用显式盐加密的数据时,请勿使用 -S 选项,然后将从密文中读取盐。要生成可以使用 OpenSSL 1.1.1 解密的密文,请勿使用 -S 选项,然后会随机生成盐并将其添加到输出前面。
SUPPORTED CIPHERS
请注意,有些密码可以在编译时禁用,有些密码只有在配置文件中配置了适当的引擎后才可用。使用 -list 选项调用此命令(即 openssl enc -list)时的输出是您的 OpenSSL 版本支持的密码列表,包括通过配置的引擎提供的算法。
此命令不支持 CCM 和 GCM 等经过身份验证的加密模式,将来也不会支持此类模式。这是因为在验证身份验证标签之前必须开始流式输出(例如,当未使用 -out 时输出到标准输出)。当在管道中使用此命令时,接收端将无法在身份验证失败时回滚。当前常用的 AEAD 模式在重用 key/iv/nonce 时也会遭受机密性和/或完整性的灾难性故障,并且由于 openssl enc 将 key/iv/nonce 管理的全部负担都放在用户身上,因此暴露 AEAD 模式的风险太大而无法允许。这些 key/iv/nonce 管理问题也会影响此命令中当前暴露的其他模式,但在这些情况下故障模式不那么严重,并且无法通过稳定的发布分支删除该功能。对于批量数据加密,无论是使用经过身份验证的加密模式还是其他模式,都建议使用 openssl-cms(1),因为它提供了标准数据格式并执行所需的 key/iv/nonce 管理。
When enc is used with key wrapping modes the input data cannot be streamed, meaning it must be processed in a single pass. Consequently, the input data size must be less than the buffer size (-bufsize arg, default to 81024 bytes). The ‘-wrap’ ciphers require the input to be a multiple of 8 bytes long, because no padding is involved. The ‘*-wrap-pad’ ciphers allow any input length. In both cases, no IV is needed. See example below.
当 enc 与 key wrapping 模式一起使用时,输入数据无法流式传输,这意味着必须一次性处理。因此,输入数据大小必须小于缓冲区大小(-bufsize 参数,默认为 81024 字节)。’-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
示例
Just base64 encode a binary file:
openssl base64 -in file.bin -out file.b64
Decode the same file
openssl base64 -d -in file.b64 -out file.bin
Encrypt a file using AES-128 using a prompted password and PBKDF2 key derivation:
openssl enc -aes128 -pbkdf2 -in file.txt -out file.aes128
Decrypt a file using a supplied password:
openssl enc -aes128 -pbkdf2 -d -in file.aes128 -out file.txt -pass pass:<password>
Encrypt a file then base64 encode it (so it can be sent via mail for example) using AES-256 in CTR mode and PBKDF2 key derivation:
openssl enc -aes-256-ctr -pbkdf2 -a -in file.txt -out file.aes256
Base64 decode a file then decrypt it using a password supplied in a file:
openssl enc -aes-256-ctr -pbkdf2 -d -a -in file.aes256 -out file.txt -pass file:<passfile>
AES key wrapping:
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
Bugs
-A 选项在处理大文件时无法正常工作。另一方面,在不使用 -A 选项的情况下进行 base64 解码时,如果输入的前 1024 个字节不包含换行符,则前两行输入将被忽略。
openssl enc 命令仅支持具有特定参数的固定数量的算法。因此,例如,如果您想使用带有 76 位密钥的 RC2 或带有 84 位密钥的 RC4,则无法使用此程序。
历史
The default digest was changed from MD5 to SHA256 in OpenSSL 1.1.0.
The -list option was added in OpenSSL 1.1.1e.
The -ciphers and -engine options were deprecated in OpenSSL 3.0.
The -saltlen option was added in OpenSSL 3.2.
Views: 0