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

How to generate a PEM-formatted Key from a 64Byte raw hex-formatted Key

我有以下问题:

从签名交易中重新创建 public 密钥后,我尝试用它加密一些有效负载。 但是,名为“crypto”的 node.js 模块需要 [=44 中的 pem 格式的密钥=]加密(密钥,有效载荷)函数。

我的问题:

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

Here is the recreated 64 Byte public key: 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 的评论。

经过进一步研究,我终于设法 encrypt/decrypt 使用 secp256k1 密钥的非对称消息。 在 Cryptos ECDH class 的帮助下,我设法创建了一个密钥对象,然后将私钥分配给它。分配后,您可以使用 getPublicKey() 轻松派生出 public 密钥。所有参与者都将为自己创建一个密钥对象并将其私钥分配给它。然后他们分享他们检索到的 public 密钥(在我的例子中是通过共享媒体)。此外,我使用了一个名为 standard-ecies 的 npm-package,它提供了 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 密钥。 不管怎样,如果有人有类似的问题,我希望这个答案对您有所帮助!