标签: pkeyutl

  • openssl-pkeyutl

    公钥算法命令

    概要

    openssl pkeyutl [-help] [-in file] [-rawin] [-digest algorithm] [-out file] [-sigfile file] [-inkey filename|uri] [-keyform DER|PEM|P12|ENGINE] [-passin arg] [-peerkey file] [-peerform DER|PEM|P12|ENGINE] [-pubin] [-certin] [-rev] [-sign] [-verify] [-verifyrecover] [-encrypt] [-decrypt] [-derive] [-kdf algorithm] [-kdflen length] [-pkeyopt opt:value] [-pkeyopt_passin opt[:passarg]] [-hexdump] [-asn1parse] [-engine id] [-engine_impl] [-rand files] [-writerand file] [-provider name] [-provider-path path] [-propquery propq] [-config configfile]

    描述

    这个命令用于执行low-level的公钥操作,支持任何openssl支持的算法
    默认情况下假定使用-sign操作

    选项

    • -help

      Print out a usage message.

    • -in filename

      指定输入数据的文件名,如果不指定则从标准输入读取

    • -rawin

      这个选项指示要签名和验证的输入数据是raw数据,即没有使用摘要算法处理过,除EdDSA外还可以指定-digest选项。对于签名算法,像RSA,DSA,ECDSA,默认的摘要算法是SHA-256,对于SM2则是SM3摘要算法。
      这个选项只能与-sign和-verify一起使用,对于EdDSA(Ed25519和Ed448算法)这个选项是必须的。

    • -digest algorithm

      此选项只能与 -sign 和 -verify 一起使用。它指定在使用输入密钥对输入数据进行签名或验证之前用于对输入数据进行哈希处理的摘要算法。如果签名算法在签名之前不需要通过pluggable哈希函数对输入进行预处理(例如,EdDSA),则可以省略此选项。如果省略此选项但签名算法需要该选项并且给出了 -rawin 选项,则将使用默认值(有关详细信息,请参阅 -rawin)。如果存在-digest选项,则需要与 -rawin 选项一起使用。
      目前,不支持 HashEdDSA(EdDSA 的 ph 或“prehash”变体),因此 -digest 选项不能与 EdDSA 一起使用。

    • -out filename

      指定输出文件名,默认写入到标准输出

    • -sigfile file

      签名的数据文件,只与-verify选项一起使用。

    • -inkey filename|uri

      输入的密钥,默认是一个私钥。

    • -keyform DER|PEM|P12|ENGINE

      密钥格式; unspecified by default

    • -passin arg

      The input key password source. For more information about the format of arg see openssl-passphrase-options(1).

    • -peerkey file

      指定的文件包含对方的公钥,用于密钥交换(派生)操作

    • -peerform DER|PEM|P12|ENGINE

      The peer key format; unspecified by default. See openssl-format-options(1) for details.

    • -pubin

      当存在这个选项时从-inkey读取的是公钥而不是私钥,如果输入是一个私钥,则使用其公钥部分。

    • -certin

      从证书中读取公钥

    • -rev

      反转输入缓冲区的字节序。这对于某些以小端格式表示缓冲区的库(如 CryptoAPI)很有用。这不能与 -rawin 一起使用。

    • -sign

      对输入数据进行签名并输出签名结果。这需要私钥。建议同时使用消息摘要操作,如适用,请参阅 -rawin 和 -digest 选项了解详情。否则,使用 -in 选项给出的输入数据将被视为已经是摘要,但在某些情况下可能需要额外的 -pkeyopt digest:md(例如,使用默认 PKCS#1 填充模式的 RSA)。即使对于其他算法(如 ECDSA),额外的 -pkeyopt 选项不会影响签名输出,也建议使用,因为它可以检查输入长度是否与预期摘要一致。

    • -verify

      根据 -sigfile 选项给出的签名验证输入数据,并指示验证是成功还是失败。除非指定或暗示了 -rawin 选项,否则 -in 选项给出的输入数据将被视为哈希值。对于原始数据,当摘要算法适用时,尽管可以从签名推断出所用的摘要算法或采用默认值,但也应指定摘要算法。

    • -verifyrecover

      验证给定的签名并输出恢复的recovered data(signature payload,即原始数据,如果有的话)。例如,对于 RSA PKCS#1,恢复的数据是摘要算法 OID 和值的 EMSA-PKCS-v1_5 DER 编码,如 RFC8017(PKCS#1 2.2) 第 9.2 节中所述。
      请注意,此处使用 -in 选项给出的输入不是签名输入(待签名数据)(与 -sign 和 -verify 选项一样),而是签名输出值(签名结果),通常使用 -sign 选项生成。
      此选项仅适用于 RSA 密钥。

    • -encrypt

      使用一个公钥加密数据

    • -decrypt

      使用一个私钥解密数据

    • -derive

      使用peer key派生(Derive)一个共享秘密值

    • -kdf algorithm

      使用的密钥派生函数算法。目前支持的算法有 TLS1-PRF 和 HKDF。注意:通常必须设置附加参数和 KDF 输出长度才能使其正常工作。请参阅 EVP_PKEY_CTX_set_hkdf_md(3) 和 EVP_PKEY_CTX_set_tls1_prf_md(3) 了解每种算法支持的字符串参数。

    • -kdflen length

      指定KDF函数的输出长度

    • -pkeyopt opt:value

      用opt:value格式指定的公钥选项。详情看下面NOTES部分

    • -pkeyopt_passin opt[:passarg]

      允许从 stdin 或密码源读取公钥选项 opt。如果仅指定 opt,系统将提示用户在 stdin 上输入密码。或者,可以指定 passarg,它可以是 openssl-passphrase-options(1) 支持的任何值。

    • -hexdump

      输出数据的16进制

    • -asn1parse

      解析 ASN.1 输出数据以检查其 DER 编码并打印任何错误。与 -verifyrecover 选项结合使用时,这可能仅在 ASN.1 DER 编码结构已直接签名(未对其进行哈希处理)的情况下才有用。

    • -engine id

      See “Engine Options” in openssl(1). This option is deprecated.

    • -engine_impl

      When used with the -engine option, it specifies to also use engine id for crypto operations.

    • -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).

    • -config configfile

      See “Configuration Option” in openssl(1).

    NOTES

    支持的操作和选项因密钥算法及其实现而异。OpenSSL 操作和选项如下所示。

    除非另有说明,所有算法都支持 digest:alg 选项,该选项指定用于签名和验证操作的摘要。值 alg 应表示 EVP_get_digestbyname() 函数中使用的摘要算法名称,例如 sha1。此值不用于对输入数据进行哈希处理。它(由某些算法)用于对传入的数据长度进行健全性检查,并用于创建组成签名的结构(例如 RSASSA PKCS#1 v1.5 签名中的 DigestInfo)。

    此命令不对输入数据进行哈希处理(使用 -rawin 的情况除外),而是将数据直接用作签名算法的输入。根据密钥类型、签名类型和填充模式,输入数据的最大可接受长度会有所不同。签名数据不能长于 RSA 的密钥模数。对于 ECDSA 和 DSA,数据的长度不应超过字段大小,否则将被默默截断为字段大小。无论如何,输入大小不得大于支持的最大摘要大小。

    换句话说,如果摘要的值是 sha1,则输入应该是 SHA-1 哈希函数输出的 20 字节长的二进制编码。(所以输入数据应该事先用Hash处理,避免数据超过长度,使用 -rawin 的情况除外)

    RSA算法

    RSA-PSS 算法是 RSA 算法的受限版本,仅支持使用 PSS 填充的签名和验证操作。支持以下附加 -pkeyopt 值:

    • rsa_padding_mode:mode, rsa_pss_saltlen:len, rsa_mgf1_md:digest

      这些与 RSA 算法含义相同,但有一些额外的限制。填充模式只能设置为 pss,这是默认值。
      如果密钥有参数限制,则摘要、MGF1 摘要和盐长度将设置为参数中指定的值。摘要(-digest指定,且本命令不做Hash处理)和 MG(mgf1) 不能更改,盐长度不能设置为小于最小限制的值。

    DSA算法

    DSA 算法仅支持签名和验证操作。目前除了 digest 之外没有其他 -pkeyopt 选项。默认采用 SHA1 摘要。

    DH算法

    DH算法只支持密钥派生操作,没有-pkeyopt选项

    EC ALGORITHM

    EC 算法支持签名、验证和派生操作。签名和验证操作使用 ECDSA,派生使用 ECDH。-pkeyopt digest选项默认采用 SHA1。

    X25519 AND X448 算法

    X25519 and X448算法只支持密钥派生操作,没有-pkeyopt选项

    SM2

    SM2 算法支持签名、验证、加密和解密操作。对于签名和验证操作,SM2 需要传入 Distinguishing ID 字符串。支持以下 -pkeyopt 值:

    • distid:string

      设置SM2签名或验证操作中使用的ID字符串。验证SM2签名时,ID字符串必须与签名数据时使用的相同。否则验证将失败。

    • hexdistid:hex_string

      此项设置 SM2 签名或验证操作中使用的 ID 字符串。验证 SM2 签名时,ID 字符串必须与签名数据时使用的字符串相同。否则验证将失败。此选项提供的 ID 字符串应为有效的十六进制值。

    示例

    • DH

      生成公共参数p和g(DH参数,p是个素数)

      openssl dhparam -out dhparam.pem 2048

      生成本地的随机秘密值及对应的公开参数(本地密钥对,a是私钥,A = ga mod p是公钥)

      openssl genpkey -paramfile dhparam.pem -out local_private_key.pem
      openssl pkey -in local_private_key.pem -pubout -out local_public_key.pem

      生成方对的随机秘密值及对应的公开参数(对方密钥对,b,B = gb mod p)

      openssl genpkey -paramfile dhparam.pem -out peer_private_key.pem
      openssl pkey -in peer_private_key.pem -pubout -out peer_public_key.pem

      计算共享秘密值

      openssl pkeyutl -derive -inkey local_private_key.pem -peerkey peer_public_key.pem -out shared_key.bin

    • ECDH

      生成本地ECC密钥对(ECDH的域参数对于一个特定的曲线来说是固定的,所以已经包含在密钥对中了,域参数包含了G值,G值双方共享的公共参数,对应DH算法中的p和g)

      openssl ecparam -name prime256v1 -genkey -noout -out local_private_key.pem
      openssl ec -in local_private_key.pem -pubout -out local_public_key.pem

      生成对方ECC密钥对

      openssl ecparam -name prime256v1 -genkey -noout -out peer_private_key.pem
      openssl ec -in peer_private_key.pem -pubout -out peer_public_key.pem

      派生共享秘密值

      openssl pkeyutl -derive -inkey local_private_key.pem -peerkey peer_public_key.pem -out shared_key.bin

    • RSA加解密

      生成私钥

      openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048

      生成公钥

      openssl pkey -in private_key.pem -pubout -out public_key.pem

      公钥加密

      openssl pkeyutl -in .\msg.txt -inkey .\public_key.pem -pubin -encrypt -out encrypted.bin

      私钥解密

      openssl pkeyutl -in .\encrypted.bin -inkey private_key.pem -decrypt

      openssl虽然支持私钥加密,但没有提供私解解密的功能

    • SM2加解密

      生成sm2密钥对

      openssl genpkey -algorithm sm2 -out sm2.key -outpubkey sm2_pub.pem

      公钥加密

      openssl pkeyutl -in .\msg.txt -inkey .\sm2.key -encrypt -out enc_pub.txt

      私钥解密

      openssl pkeyutl -decrypt -inkey .\sm2.key -in .\enc_pub.txt

    • RSA签名和验签

      签名

      openssl pkeyutl -sign -in msg.txt -rawin -inkey rsa.key -out msg.txt.sig

      验签

      openssl pkeyutl -verify -in msg.txt -sigfile msg.txt.sig -inkey .\rsapub.pem -pubin -rawin

    • RSA带数据恢复签名

      pkeyutl命令签名(不要使用-rawin选项,否者恢复出来的就是hash值了,而且仅支持pkcs1.5填充)

      openssl pkeyutl -sign -in msg.txt -inkey rsa.key -out msg.txt.sig -pkeyopt rsa_padding_mode:pkcs1

      rsautl命令

      openssl rsautl -sign -in msg.txt -inkey rsa.key -out sig -pkcs

      pkeyutl命令恢复数据

      openssl pkeyutl -verifyrecover -in sig -inkey .\rsapub.pem -pubin

      rsautl命令恢复数据

      openssl rsautl -verify -in sig -inkey rsapub.pem -pubin

    Views: 1