Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js OpenSSL EdDSA指定密钥大小_Node.js_Openssl_Elliptic Curve - Fatal编程技术网

Node.js OpenSSL EdDSA指定密钥大小

Node.js OpenSSL EdDSA指定密钥大小,node.js,openssl,elliptic-curve,Node.js,Openssl,Elliptic Curve,我需要为NodeJS的椭圆模块生成一些带有ed25519曲线的密钥对,用于我正在进行的项目。经过一些搜索后,发现可以使用以下命令完成此操作: openssl genpkey-算法ed25519-out private.pem 但是,这始终会生成长度为64个字符的密钥。不过,我希望为键指定一个特定的大小。这是否可以使用OpenSSL实现?如果没有,请告诉我一种方法,通过这种方法,可以在其他地方安全地生成具有设置大小的密钥 另外,我对椭圆曲线密码非常陌生,还不太了解EdDSA密钥是如何生成的。因此

我需要为NodeJS的
椭圆
模块生成一些带有ed25519曲线的密钥对,用于我正在进行的项目。经过一些搜索后,发现可以使用以下命令完成此操作:

openssl genpkey-算法ed25519-out private.pem
但是,这始终会生成长度为64个字符的密钥。不过,我希望为键指定一个特定的大小。这是否可以使用OpenSSL实现?如果没有,请告诉我一种方法,通过这种方法,可以在其他地方安全地生成具有设置大小的密钥


另外,我对椭圆曲线密码非常陌生,还不太了解EdDSA密钥是如何生成的。因此,请告诉我是否完全无法理解这一点,如果是,请解释我犯了严重错误的地方。

ed25519私钥定义长度为32字节。根据RFC8032第5.1.5节:

私钥是
的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字节,您不能更改它。这是该算法的一个基本属性。

@arctic\u hen7您在这里可能指的是32字节,而不是32位

  • “…ed25519私钥根据定义长度为32-
  • “…私钥是32个八位字节(256位,对应于b)
  • “…显示长度为32字节的私钥,如预期的那样…”
  • “…但底线是,ed25519私钥始终为32位,您无法更改它…”