OpenSSL EdDSA 指定密钥大小

6

我需要为我正在开发的项目使用NodeJS的elliptic模块生成ed25519曲线的一些密钥对。经过一些搜索,我发现可以通过以下命令来完成:

openssl genpkey -algorithm ed25519 -out private.pem

然而,这总是生成一个长度为64个字符的密钥。我希望可以指定密钥的特定大小。在OpenSSL中是否可能实现这一点?如果不行,请指导我如何在其他地方安全地生成具有设置大小的密钥。

此外,我对椭圆曲线密码学非常陌生,还不太理解EdDSA密钥是如何生成的。所以如果我完全没有理解,请告诉我,并解释我哪里出了问题。


你的意思是64个十六进制字符吗?换句话说,32个字节? - dionyziz
2个回答

9

根据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字节,并且无法更改。这是算法的基本属性。


ed25519私钥的长度定义为32字节。RSA密钥具有可定制的长度以保证未来兼容性。您可以通过增加长度来增强安全性。您是否在说ed25519没有这样的未来兼容性功能? - cowlinator
是的 - 这是正确的 - Matt Caswell
一般来说,如果一个算法出了问题,让它变长并不能解决问题。"在现代世界中,对于原始密码学基元拥有多个“安全级别”的概念,大多是历史上密码学的军事根源的产物,而不是现代世界中的严肃考虑。" 来源,该文章推荐使用ed25519算法。 - DharmaTurtle

0

你可能想说的是32字节而不是32位

  1. "...ed25519私钥的长度定义为32-字节。来自5.1.5章节..."
  2. "...私钥是32个八位组(256位,相当于b)..."
  3. "...这显示了一个预期长度为32字节的私钥...."
  4. "...然而,ed25519私钥始终为32位,不能更改...."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接