Javascript Forge Crypto Library: recreate public and private keys for later reuse

In the Forge Javascript cryptographic library , I find it difficult to determine how to recover the private and public keys after I used them. I tried to do the following:

var rsa = forge.pki.rsa; var keypair = rsa.generateKeyPair({bits: 2048, e: 0x10001}); var ct = keypair.publicKey.encrypt("Arbitrary Message Here"); keypair.privateKey.decrypt(ct); 

What outputs: "Arbitrary Message Here" , as expected. I tried to recover the public key as follows:

 var nVal = JSON.stringify(keypair.publicKey.n); var eVal = JSON.stringify(keypair.publicKey.e); var nwRsa = rsa.setPublicKey(JSON.parse(nHere), JSON.parse(eHere)); var nwCt = nwRsa.encrypt("Arbitrary Message Here"); 

When I try to encrypt the message again, I get the error message:

 "TypeError: Object #<Object> has no method 'bitLength'" 

I'm not sure why, although I suppose I used the method correctly:

 /** * Sets an RSA public key from BigIntegers modulus and exponent. * * @param n the modulus. * @param e the exponent. * * @return the public key. */ pki.setRsaPublicKey = pki.rsa.setPublicKey = function(n, e) { var key = { n: n, e: e }; 

And I didn’t even try to recover the private key. I'm not sure what I'm doing right, can someone help me? As always in advance!

Optional Afterthough: here are the files that I import on my html page, I believe that I solved all the problems with the dependencies, but just in case (beware, they are not in alphabetical order, but in the order of dependency):

 <script src="forge/util.js"></script> <script src="forge/debug.js"></script> <script src="forge/jsbn.js"></script> <script src="forge/oids.js"></script> <script src="forge/asn1.js"></script> <script src="forge/sha1.js"></script> <script src="forge/sha256.js"></script> <script src="forge/md5.js"></script> <script src="forge/md.js"></script> <script src="forge/aes.js"></script> <script src="forge/prng.js"></script> <script src="forge/random.js"></script> <script src="forge/jsbn.js"></script> <script src="forge/pkcs1.js"></script> <script src="forge/rsa.js"></script> <script src="forge/des.js"></script> <script src="forge/rc2.js"></script> <script src="forge/pbe.js"></script> <script src="forge/pem.js"></script> <script src="forge/hmac.js"></script> <script src="forge/pbkdf2.js"></script> <script src="forge/pkcs7asn1.js"></script> <script src="forge/pkcs12.js"></script> <script src="forge/pss.js"></script> <script src="forge/mgf1.js"></script> <script src="forge/mgf.js"></script> <script src="forge/x509.js"></script> <script src="forge/pki.js"></script> 

TL; DR: In Forge, how to give your public key to someone else and how to store your private key for several purposes?

+7
javascript cryptography
source share
1 answer

I was fortunate enough to contact the developer by raising a problem on Github . He gave me the correct methods to use, and they all seem to work. Quoting directly, here is the correct use:

The easiest and most compatible way to transfer public keys or store private keys is to convert them to PEM format. Private keys may optionally be encrypted when they are converted (using a different method, see below).

Convert public key to / from PEM:

 // convert a Forge public key to PEM-format var pem = pki.publicKeyToPem(publicKey); // convert a PEM-formatted public key to a Forge public key var publicKey = pki.publicKeyFromPem(pem); Converting a private key to/from PEM: // convert a Forge private key to PEM-format // (preferred method if you don't want encryption) var pem = pki.privateKeyToPem(privateKey); // wraps and encrypts a Forge private key and outputs it in PEM format // (preferred method if you do want encryption) var pem = pki.encryptRsaPrivateKey(privateKey, 'password'); // encrypts a Forge private key and outputs it in PEM format using OpenSSL's // proprietary legacy format + encapsulated PEM headers (DEK-Info) // (perhaps more compatible with some legacy OpenSSL-based applications) var pem = pki.encryptRsaPrivateKey(privateKey, 'password', {legacy: true}); // decrypts a PEM-formatted, encrypted private key var privateKey = pki.decryptRsaPrivateKey(pem, 'password'); 
+13
source share

All Articles