1.0.3 • Published 4 years ago

js-rsa v1.0.3

Weekly downloads
3
License
MIT
Repository
github
Last release
4 years ago

RSA in JavaScript (UMD)

test:

    npm run test-init


    npm run test-en


    npm run test-de

Test directory contains examples

usage:

    var rsa = require('../index');
    
    var keypair = new rsa.RSAKeyPair(
    		// Public exponent extracted from private_key.pem using
    		// openssl rsa -inform PEM -text -noout < private_key.pem
    		// Or extracted from public key PEM file using
    		// openssl rsa -pubin -inform PEM -text -noout < public_key.pem
    		"10001",
    
    		// Dummy decryption exponent -- actual value only kept on server.
    		"10001",
    
    		// Modulus extracted from private key PEM file using
    		// openssl rsa -inform PEM -modulus -noout < private_key.pem
    		// Or extracted from public key PEM file using
    		// openssl rsa -pubin -inform PEM -modulus -noout < public_key.pem
    		"DE3D7D7639DB81D0E920EA7026A6EB47EA1E31F463BE200B54571CA496DCB86DB3D8E54DEC3A8BAF757147635A9785C086FBCB55E14D1E38700120D3F8CB753AD97AEC2F143A13D73937380EFDD2DC210996ADAF666DDB1319060F883EB8E30490C006B30574B48A18424759D996C3FF9454A16695060751C0463D9CA329897BBDB3E8B815BD6E92A0DBAFE4169E8CB624A137AA963F98C27EDE9BBE0ADB7C630D881BD5129D66FA63B68125880EE914CC81910C11FCDB6E7C8F33E8ADB454B6013FBD2C207ABF3F9CDB4B6CFE64438C926D65E75AD145F520591A9103EE88402DBC7BF3DD8CB3F87D4087A8233177CB2ADFF846A7D3BA529DD3AA53FE2AA74B",
    
    		// Key size in bits.
    	 	2048
    	);
    
    
    global.Buffer = global.Buffer || require('buffer').Buffer;
    
    if (typeof btoa === 'undefined') {
        global.btoa = function (str) {
            return new Buffer(str, 'binary').toString('base64');
        };
    }
    
    if (typeof atob === 'undefined') {
        global.atob = function (b64Encoded) {
            return new Buffer(b64Encoded, 'base64').toString('binary');
        };
    }
    
    var ciphertext = rsa.encryptedString(keypair, 'type',
    		rsa.RSAAPP.PKCS1Padding, rsa.RSAAPP.RawEncoding);
    	// ciphertext is a string composed of the raw binary data. base-64 encode it.
    	console.log('Encrypted String:  ' + btoa(ciphertext));

Creating and managing keys

Creating a new keypair: To create a new 2048-bit keypair from a command-line interpreter such as bash, use this command:

openssl genrsa -out private_key.pem 2048

This prints out all key components as hexadecimal numbers. openssl rsa -inform PEM -text -noout < private_key.pem

The component called "publicExponent" is what you're looking for, and by default it has the value 0x10001:

publicExponent: 65537 (0x10001)

The hex value, e.g. "10001", is provided to the JavaScript library without the leading "0x". The other numbers, such as the modulus, are formatted in a way that delimits each byte with a colon. However, there is a different flag that prints the modulus only, without the colons:

openssl rsa -inform PEM -modulus -noout < private_key.pem

After removing the "Modulus=" prefix, the rest of the value can be directly used by the JavaScript library, as you can see in the source for this webpage.

Using a third-party public key: If someone else gives you their public key file in PEM format, you can extract the public exponent and the modulus using the same commands, but with the additional -pubin flag. To print the public exponent, use:

openssl rsa -pubin -inform PEM -text -noout < public_key.pem

And to print the modulus, use:

openssl rsa -pubin -inform PEM -modulus -noout < public_key.pem

decrypt

// Encryption exponent and modulus generated via
// openssl genrsa -out private_key.pem 2048
$private_key = openssl_pkey_get_private('file://'.dirname(__FILE__).'/private_key.pem'); // or  openssl_pkey_get_private(file_get_contents('private_key.pem'))

// ciphertext generated by JavaScript uses PKCS1 padding, emitted as base64 string...
$ciphertext = 'W1tJpRIDdAdjsjbfjHaDtgPzrp0ll616Ht0DUNZjPY1qXsTAO0Gu2C9bBKMJyKi/ASoXxi9av4rd8mHqaFNL18Ye7boeSJL0bYIslYJ/+GOIXytiUI86DyYUCbGt9myLocpTmncFdboDhPZiA9Qr0rC5PYcGoS/0MHL88M0G8Db7AaB2piq4UoNTGNAaWF06wFIXX6ij+msN1qYhI7G6UMYsEdqNn4ukMfX4h45h0IiqZ7RVp6PP1nQyMQ84z4WUtQ7i0Rb/5XE9xVzqvIIxeJVv3Am+0UZ7d6wtH9M46d7UCg4EwHV2X/G1S4u3xUQPJQtLRX0Z5P/7fcxHPTtq3g==';

// ...convert to binary.
$bin_ciphertext = base64_decode($ciphertext);

openssl_private_decrypt($bin_ciphertext, $plaintext, $private_key, OPENSSL_PKCS1_PADDING)
	or die("openssl_private_decrypt failed.");

	var_dump($plaintext);

origin: http://www.ohdave.com/rsa/

1.0.3

4 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago