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