arc*_*en7 4 openssl elliptic-curve node.js
我需要为elliptic我正在处理的项目的 NodeJS模块生成一些带有 ed25519 曲线的密钥对。经过一番搜索,发现可以使用以下命令完成此操作:
openssl genpkey -algorithm ed25519 -out private.pem
Run Code Online (Sandbox Code Playgroud)
但是,这始终会生成长度为 64 个字符的密钥。不过,我希望为密钥指定一定的大小。这可以使用 OpenSSL 吗?如果没有,能否请我指出一种方法,该方法可以在其他地方安全地生成具有设定大小的此类密钥?
另外,我对椭圆曲线密码学很陌生,还不太了解 EdDSA 密钥是如何生成的。所以请告诉我我是否完全无法理解这一点,如果是这样,请解释我哪里出错了。
根据定义,ed25519 私钥的长度为 32 字节。来自 RFC8032 的第 5.1.5 节:
私钥是 32 个八位字节(256 位,对应于 b)的
加密安全随机数据。有关随机性的讨论,请参阅 [RFC4086]。
我不知道你在上面的问题中从哪里得到 64 个字符。我可能希望您查看编码长度 - 但这也没有意义。
如果我这样做:
openssl genpkey -algorithm ed25519 -out private.pem
Run Code Online (Sandbox Code Playgroud)
然后我得到一个长度为 119 字节的 PEM 编码的私钥。这是根据 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
Run Code Online (Sandbox Code Playgroud)
实际的原始私钥本身被编码为上面显示的 OCTET STRING内的 OCTET STRING(根据 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
Run Code Online (Sandbox Code Playgroud)
这会按预期向您显示长度为 32 字节的私钥。
某些软件可能会以不符合 RFC8410 的不同格式存储密钥(例如,通过将私钥和公钥存储在一起) - 因此,如果您将此密钥加载到其他东西中,那么这可能解释了 64 的来源。但是,您不能使用 OpenSSL 生成这些格式。
然而最重要的是,ed25519 私钥始终是 32 字节,您无法更改它。它是算法的基本属性。
| 归档时间: |
|
| 查看次数: |
1372 次 |
| 最近记录: |