【问题标题】:How to generate a PEM-formatted Key from a 64Byte raw hex-formatted Key如何从 64 字节原始十六进制格式的密钥生成 PEM 格式的密钥
【发布时间】:2019-12-20 19:22:27
【问题描述】:

我有以下问题:

从签名交易重新创建公钥后,我尝试用它加密一些有效负载。 然而,名为“crypto”的 node.js-模块在 publicEncrypt(key, payload) 函数中需要一个 pem 格式的密钥。

我的问题:

如何从原始十六进制编码的密钥创建 pem 格式的密钥?

这是重新创建的 64 字节公钥: 9f9f445051e788461952124dc08647035c0b31d51f6b4653485723f04c9837adb275d41731309f6125c14ea1546d86a27158eec4164c00bab4724eed925e9c60

信息:

我知道,pem-format-key 由 base64 编码数据、页眉和页脚组成。

-----BEGIN RSA PUBLIC KEY-----
BASE64 ENCODED DATA
-----END RSA PUBLIC KEY-----

我还发现在 base64 编码数据中存在以下 DER 结构:

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

所以唯一的问题是如何原始十六进制编码密钥这个DER结构。

我将不胜感激!

【问题讨论】:

  • 您确定这是 RSA 公钥吗?似乎更合乎逻辑的是,这是一个 secp256k1 公钥,用于例如比特币,由两个 256 位值组成,表示曲线上的一个点。请注意,您的值不是奇数,并且由于素数是奇数,并且由于将两个奇数相乘会产生奇数……嗯,奇怪的是模数不是奇数,这就是我想说的…… .
  • 感谢您的快速评论。嗯,你是对的,它是一个 secp256k1 公钥。我一开始并没有真正考虑到这一点。我有两个密钥,公钥和私钥,它们是 secp256k1。但是它们仍然可以用于对消息应用非对称加密,对吗?所以唯一的问题是我不能以 PEM 格式提供它们..

标签: node.js cryptography rsa public-key-encryption pem


【解决方案1】:

问题解决了

感谢 Maarten Bodewes 和他关于密钥是 secp256k1 而不是 RSA 的评论。

经过进一步研究,我终于设法使用 secp256k1 密钥对消息进行非对称加密/解密。 在 Cryptos ECDH 类的帮助下,我设法创建了一个密钥对象,然后将私钥分配给它。分配后,您可以使用getPublicKey() 轻松派生公钥。所有参与者都会为自己创建一个密钥对象并将他们的私钥分配给它。然后他们共享他们检索到的公钥(在我的例子中是通过共享介质)。此外,我使用了一个名为 standard-ecies 的 npm 包,它提供了 ECIES 加密方案。

代码:

const crypto = require('crypto');
const ecies = require('standard-ecies');

var buffer = new Buffer("Hello World");

var ecdh = crypto.createECDH('secp256k1');
ecdh.setPrivateKey(privateKey);

var encryptedText = ecies.encrypt(ecdh.getPublicKey(), buffer);
var decryptedText = new Buffer(ecies.decrypt(ecdh, encryptedText));

我应该注意到这一点,因为 crypto 的加密功能 (link to the api-doc) 显然只适用于 RSA 密钥,而不适用于 secp256k1 密钥。 无论如何,如果有人有类似的问题,我希望这个答案会有所帮助!

【讨论】:

  • 我投了赞成票,但请注意,这并不能真正回答有关将现有“平面”公钥点转换为 PEM 的问题。不幸的是,我不知道如何使用 JS 来做到这一点(尽管我已经为 Java 和其他语言展示了它)。诀窍是将其转换为 X9.62 或 X.509 SubjectPublicKeyInfo 结构以供那些想要查找它的人使用。当然,或者只是找到正确的 API 调用。
  • @MaartenBodewes 查看这个答案,它用于私钥,但也许它也可以用于公共stackoverflow.com/a/61263419/1267201
  • @zavr 好吧,ASN1 库当然可以提供帮助,但代码不兼容。
猜你喜欢
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 2015-11-15
  • 1970-01-01
  • 2019-06-21
  • 2019-03-09
相关资源
最近更新 更多