Rajesh Kumar
Rajesh Kumar

Reputation: 51

How to do Hybrid Encryption in NodeJS in given below steps?

Steps for Encryption

1) Generate a 16 digits random number. Say RANDOMNO.
2) Encrypt RANDOMNO using RSA/ECB/PKCS1Padding and encode using Base64. Say encryptedKey.
3) Perform AES/CBC/PKCS5Padding encryption on request payload using RANDOMNO as a key and iv-initialization vector. Say encrypted_data.
4) Now client may choose to send IV in request from one of the below two options.
a. Send Base64 Encoded IV in the "iv" tag. (Recommended Approach)
b. Send IV as a part of encrypted data itself. 

bytes[] iv = IV
bytes[] cipherText = symmetrically encrypted Bytes (step3)
bytes[] concatB = iv + cipherText
encryptedData= B64Encode(concatB)

Please can someone help me on the above?. I tried my level best to find the solution.

I tried the bellow query, I am not sure that this is wrong or right

var request = require("request");
var crypto = require('crypto');
var fs = require('fs');  

var object = {name : "Test", age : '28'}

var keyProfile = crypto.createPublicKey(fs.readFileSync(__dirname + '/publickey.txt'));
  var packetData = Buffer.from(JSON.stringify(object));

var randomno = 'SwAW1D8kbcXVrq31'//Randomly generated string of length 16 (OR 32).
  var encryptedKey = crypto.publicEncrypt({ key: keyProfile, padding: crypto.constants.RSA_PKCS1_PADDING }, Buffer.from(randomno)).toString('base64');

  // Symmetric encryption
  var iv = crypto.randomBytes(16);
  var cipher = crypto.createCipheriv('aes-128-cbc', randomno, iv);
  var encryptedData = cipher.update(packetData, 'utf8', 'base64');  
  encryptedData += cipher.final('base64');
  console.log(encryptedData)

Upvotes: 1

Views: 1582

Answers (1)

RAJESH KUMAR
RAJESH KUMAR

Reputation: 1

var request = require("request");
var crypto = require('crypto');
var fs = require('fs');  
var object = {name : "Test", age : '28'}
var keyProfile = crypto.createPublicKey(fs.readFileSync(__dirname + '/publickey.txt'));
var packetData = Buffer.from(JSON.stringify(object));

var randomno = 'SwAW1D8kbcXVrq31'//Randomly generated string of length 16.
var encryptedKey = crypto.publicEncrypt({ key: keyProfile, padding: crypto.constants.RSA_PKCS1_PADDING }, Buffer.from(randomno)).toString('base64');
var iv = crypto.randomBytes(16);
var cipher = crypto.createCipheriv('aes-128-cbc', randomno, iv);
var encryptedData = cipher.update(packetData, 'utf8', 'base64');  
encryptedData += cipher.final('base64');
return encryptedData

Upvotes: 0

Related Questions