标签: 加密,对称加密

  • 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