我有以下问题:
从已签名的交易重新创建公钥后,我尝试使用它加密一些有效负载。 然而,名为">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 密钥。 无论如何,如果有人有类似的问题,我希望这个答案有所帮助!