如何从ED25519公钥PEM提取32字节密钥及生成对应PEM?
ED25519公钥提取与PEM生成问题
背景
我用OpenSSL生成了ED25519密钥对,命令如下:
openssl genpkey -algorithm ed25519 -out private.pem openssl pkey -in private.pem -pubout -out public.pem
已成功从私钥PEM中提取出32字节ED25519密钥,命令:
openssl asn1parse -in private.pem -offset 14
输出结果:
0:d=0 hl=2 l= 32 prim: OCTET STRING [HEX DUMP]:1E9D38B5274152A78DFF1A86FA464CEADC1F4238CA2C17060C3C507349424A34
得到的32字节密钥(十六进制编码):
1E9D38B5274152A78DFF1A86FA464CEADC1F4238CA2C17060C3C507349424A34
现需解决两个问题:
- 如何从公钥PEM文件
public.pem中提取32字节ED25519公钥? - 如何仅通过已知的32字节ED25519公钥生成合法的公钥PEM文件?
一、从公钥PEM提取32字节公钥
ED25519公钥的PEM文件遵循固定ASN.1结构,直接用asn1parse命令提取:
openssl asn1parse -in public.pem -offset 22
这里的offset 22对应公钥数据在ASN.1结构中的起始位置,执行后会输出类似:
0:d=0 hl=2 l= 32 prim: OCTET STRING [HEX DUMP]<你的公钥十六进制>
提取输出中的十六进制字符串,即为32字节ED25519公钥。
若想直接输出纯十六进制(过滤多余信息),可使用管道组合命令:
openssl asn1parse -in public.pem -offset 22 -out /dev/stdout -noout | xxd -p -c 32
二、从32字节公钥生成PEM文件
ED25519公钥PEM是DER编码的ASN.1结构经过Base64编码并添加头尾注释生成的,可通过以下两种方法生成:
方法1:单命令链实现
假设你持有32字节公钥的十六进制字符串(示例:A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2),执行:
# 将十六进制转为二进制,再拼接ASN.1前缀并生成PEM echo -n "A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2" | xxd -r -p | openssl pkey -pubin -inform der -outform pem -out public_new.pem -in <(echo "302A300506032B6570032100"$(cat /dev/stdin | xxd -p -c 32))
其中302A300506032B6570032100是ED25519公钥的ASN.1 DER固定前缀,用于标识密钥算法和结构。
方法2:分步构造
- 拼接完整的DER十六进制:固定前缀
302A300506032B6570032100+ 你的32字节公钥十六进制 - 将十六进制转为二进制DER文件:
echo -n "302A300506032B6570032100A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2" | xxd -r -p > pub.der
- 将DER文件转为PEM格式:
openssl pkey -pubin -inform der -outform pem -out public_new.pem -in pub.der
验证合法性:执行以下命令查看公钥信息,若输出包含ED25519标识则说明生成成功:
openssl pkey -pubin -in public_new.pem -text -noout
内容的提问来源于stack exchange,提问作者KIAaze
相关产品推荐
相关产品推荐

