如何从 64Byte 原始十六进制格式的密钥生成 PEM 格式的密钥



我有以下问题:

从已签名的交易重新创建公钥后,我尝试使用它加密一些有效负载。 然而,名为">crypto"的节点模块.js期望在publicEncrypt(key,payload(函数中使用pem格式的密钥。

我的问题:

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

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

信息:

我知道,pem格式键由base64编码数据,页眉和页脚组成。

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

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

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

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

我将不胜感激任何帮助!

问题已解决

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

经过一些进一步的研究,我终于设法使用 secp256k1 密钥不对称地加密/解密消息。 在CryptosECDH类的帮助下,我设法创建了一个密钥对象,然后将私钥分配给它。分配后,您可以使用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));

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

最新更新