Ad

How To Generate A PEM-formatted Key From A 64Byte Raw Hex-formatted Key

I have the following problem:

After recreating the public key from a signed transaction, I try to encrypt some payload with it. However the node.js-module named "crypto" is expecting a pem-formatted key in the publicEncrypt(key, payload) function.

My Question:

How can I create the pem-formatted key from a raw hex-encoded key?

Here is the recreated 64 Byte public key: 9f9f445051e788461952124dc08647035c0b31d51f6b4653485723f04c9837adb275d41731309f6125c14ea1546d86a27158eec4164c00bab4724eed925e9c60

Information:

I know, that a pem-format-key consists of base64 encoded data, a header and a footer.

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

I have also found out that within the base64 encoded data the following DER-structure is present:

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

So the only question is how to get from the raw hex-encoded key to this DER-structure.

I would appreciate any help!

Ad

Answer

Problem solved

Thanks to Maarten Bodewes and his comment regarding the key being secp256k1 and not RSA.

After some further research, I finally managed to encrypt/decrypt a message asymmetrically with secp256k1 keys. With the help of Cryptos ECDH class I managed to create a key-object and then assign the private key to it. When assigned, you can easily derive the public key with getPublicKey(). All participants would create a key object for themselves and assign their private keys to it. Then they share their retrieved public keys (in my case over a shared medium). In addition I used a npm-package named standard-ecies which provides the ECIES encryption-scheme.

Code:

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));

I should have noticed this, because crypto's encryption function (link to the api-doc) clearly works only with RSA keys and not with secp256k1 keys. Anyway if someone has a similar issue, I hope this answer helps!

Ad
source: stackoverflow.com
Ad