根据RFC8032第5.1.5节,ed25519私钥的长度定义为32字节。
私钥是32个八位组(256位,对应于b)的加密安全随机数据。有关随机性的讨论,请参见[RFC4086]。
我不知道您在上述问题中获取64个字符的来源。我猜测您可能正在查看编码后的长度 - 但那也没有意义。
如果我这样做:
openssl genpkey -algorithm ed25519 -out private.pem
接下来我得到了一个PEM编码的私钥,长度为119字节。这是根据RFC8410第7节进行编码的。您可以像这样查看其内容:
openssl asn1parse -in private.pem
0:d=0 hl=2 l= 46 cons: SEQUENCE
2:d=1 hl=2 l= 1 prim: INTEGER :00
5:d=1 hl=2 l= 5 cons: SEQUENCE
7:d=2 hl=2 l= 3 prim: OBJECT :ED25519
12:d=1 hl=2 l= 34 prim: OCTET STRING [HEX DUMP]:0420F897797B25D84588192CE39F0E6311954034CB80F6D8CD648A3BCBFC2346A83E
实际的原始私钥本身编码为八位字节字符串,位于上面显示的八位字节字符串的内部(符合RFC 8410的规定)。如上所示的八位字节字符串从偏移量12开始,标题长度为2-因此数据本身位于偏移量14处。
openssl asn1parse -in private.pem -offset 14
0:d=0 hl=2 l= 32 prim: OCTET STRING [HEX DUMP]:F897797B25D84588192CE39F0E6311954034CB80F6D8CD648A3BCBFC2346A83E
如预期所示,该密钥显示了长度为32个字节的私钥。
有些软件可能会以不符合RFC8410格式的不同格式存储密钥(例如将私钥和公钥一起存储),因此如果您将此密钥加载到其他地方,则可能解释了64来自何处。不过,你不能使用OpenSSL生成这些格式。
然而,ed25519私钥始终为32字节,并且无法更改。这是算法的基本属性。