openssl-enc

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

评论

发表回复