0

I'm working with a project that currently is doing encryption in a salesforce apex class (using the Crypto library) and that logic needs to be moved into a javascript file. The node.js package I'm trying to use to do the encryption is node-rsa.

Here's the code that currently exists in apex:

    String algName = 'RSA';
    blob signature;
    String signGen = '';
    String pKey =  'MIIEvgIBADANBgkqhkiG<rest of key snipped>';
    String payload = 'some payload';

    blob privateKey = EncodingUtil.base64Decode(pKey);
    blob input = Blob.valueOf(payload);

    signature = Crypto.sign(algName, input, privateKey);

    signGen = EncodingUtil.base64Encode(signature);

And here's the initial javascript implementation:

    var tmp = forge.util.decode64(pKey);
    var privateKey2 = new NodeRSA(tmp);

    payload = 'some payload
    var encrypted = key.encrypt(payload, 'base64');

The problem I'm having is that the line: var privateKey2 = new NodeRSA(tmp);

is causing the following error: Invalid PEM format

The private key that the node-rsa uses in their example has markets at the beginning and end of the key of: ---- BEGIN RSA PRIVATE KEY ----- ---- END RSA PRIVATE KEY -----

So I'm not sure if I have to somehow indicate to the node-rsa library that this key is in a different format. Or maybe there's another RSA javascript library I could try using?

1
  • I use this RSA JavaScript code in my Node.js applications: ohdave.com/rsa There isn't an NPM for it... I've been meaning to make one but haven't gotten around to it yet. Maybe that alternative will help you. Commented Jul 22, 2014 at 19:02

1 Answer 1

4

I left you a response for how to do this using forge here: https://github.com/digitalbazaar/forge/issues/150

var pkey = 'some base64-encoded private key';
var pkeyDer = forge.util.decode64(pkey);
var pkeyAsn1 = forge.asn1.fromDer(pkeyDer);
var privateKey = forge.pki.privateKeyFromAsn1(pkeyAsn1);

// above could be simplified if pkey is stored in standard PEM format, then just do this:
// var pkey = 'some private key in pem format';
// var privateKey = forge.pki.privateKeyFromPem(pkey);

var payload = 'some string payload';
var md = forge.md.sha1.create();
md.update(payload, 'utf8');

var signature = privateKey.sign(md);
var signature64 = forge.util.encode64(signature);

// signature64 is now a base64-encoded RSA signature on a SHA-1 digest
// using PKCS#1v1.5 padding... see the examples for other padding options if necessary
Sign up to request clarification or add additional context in comments.

1 Comment

Answers should not just be a link to an external site.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.