2.1. EC 密钥管理

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/book/pki-tutorials/2.1.manage-ec-keys/

本章节介绍如何使用 OpenSSL 生成、转换、编码、加密、解密 EC 密钥。

生成密钥

根据密钥长度,分别有如下三种:

 1# NIST P-256
 2openssl ecparam -genkey -name prime256v1 -noout -out es256-raw.pem
 3# NIST P-384
 4openssl ecparam -genkey -name secp384r1 -noout -out es384-raw.pem
 5# NIST P-521
 6openssl ecparam -genkey -name secp521r1 -noout -out es521-raw.pem
 7
 8# 如果选择 curve25519 则必须使用 genpkey 子命令,且密钥必须采用 PKCS#8 格式
 9
10openssl genpkey -algorithm ed25519 -out ed25519-raw.pem # 此处生成的是 PKCS#8 编码的密钥文件
11
12openssl genpkey -algorithm x25519 -out x25519-raw.pem # 此处生成的是 PKCS#8 编码的密钥文件

注意:

  • 此时密钥未加密存储。
  • 如果想在证书里使用 curve25519,请注意使用 ed25519 而不是 x25519,因为 X.509 证书里的非对称密钥对是用来签名的,而不是用来密钥交换的。

加密/解密密钥

加密密钥

 1# PKCS#1
 2openssl ec -aes-256-cfb -in es384-raw.pem -out es384.pem
 3
 4# PKCS#8
 5openssl pkcs8 \
 6    -topk8 \
 7    -inform PEM \
 8    -v2 aes256 \
 9    -in ed25519-p8-raw.pem \
10    -out ed25519-p8.pem

解密密钥

1openssl ec -in es384-raw.pem -out es384.pem
2
3# PKCS#8
4openssl pkcs8 \
5    -inform PEM \
6    -in ed25519-p8.pem \
7    -out ed25519-p8-raw.pem

提取公钥

1# 这个命令同时接受 PKCS#1 和 PKCS#8 两种编码的私钥
2openssl ec -in es384.pem -pubout -out es384.pub
3openssl ec -in ed25519.pem -pubout -out ed25519.pub

查看私钥信息

1# 这个命令同时接受 PKCS#1 和 PKCS#8 两种编码的私钥
2openssl ec -text -noout -in es384-raw.pem

查看公钥信息

1openssl ec -pubin -text -noout -in es384.pub
2openssl ec -pubin -text -noout -in ed25519.pub

备注

  • EC 密钥与 PKCS#8 的转换方式参考 RSA,基本一致,此处不作展开。
  • openssl ec 命令同样支持 -inform-outform,因此 DER/PEM 转换同 RSA 密钥。

测试密钥

 1openssl rand -out tmp.dat 4096
 2
 3# 测试 ECDSA 签名
 4
 5openssl dgst -sha256 -sign es384-raw.pem -out tmp.dat.sig tmp.dat
 6openssl dgst -sha256 -verify es384.pub -signature tmp.dat.sig tmp.dat
 7
 8# 测试 ECDH (curve25519)
 9
10openssl genpkey -algorithm x25519 -out x25519-a.pem
11openssl ec -in x25519-a.pem -pubout -out x25519-a.pub
12
13openssl genpkey -algorithm x25519 -out x25519-b.pem
14openssl ec -in x25519-b.pem -pubout -out x25519-b.pub
15
16openssl pkeyutl -derive -inkey x25519-a.pem -peerkey x25519-b.pub -out x25519-axb.bin
17openssl pkeyutl -derive -inkey x25519-b.pem -peerkey x25519-a.pub -out x25519-bxa.bin
18
19base64 x25519-axb.bin
20base64 x25519-bxa.bin
21
22rm x25519-*.*
23
24# 测试 EdDSA (Ed25519) 签名
25
26openssl genpkey -algorithm ed25519 -out ed25519.pem
27openssl ec -in ed25519.pem -pubout -out ed25519.pub
28
29openssl pkeyutl -sign -inkey ed25519.pem -rawin -in tmp.dat -out tmp.dat.sig
30openssl pkeyutl -verify -pubin -inkey ed25519.pub -sigfile tmp.dat.sig -rawin -in tmp.dat
31
32rm ed25519.*
33
34rm tmp.*

以上便是 EC 密钥的生成、转换、编码、加密、解密、提取、查看、测试等操作。

comments powered by Disqus

翻译: