본문 바로가기

Javascript/Node.js

Node.js RSA Encryption, Decryption

1. Private Key & Public Key 생성

// generate rsa private.key
openssl genrsa -out private.key 2048

// generate rsa public.key
openssl rsa -in private.key -out public.key -pubout

 

2. Node.js crypto를 사용한 RSA Encryption, Decryption

const crypto = require('crypto');

const rsaPrivKey = `-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAxmtuWLe0poapjNrP7wyhsPgGCikuQRU7nI+0sj9QBexrt2Mt
kVwhXdXevHXcR9sA90BkrsfJuzuoZXHA1Yl5QkW09ws3BolSYeFzvLlU0v6FwP/u
7D1vsCah2u0m3CpvnvDiV1Zl2dhC+kqRbp63+558jUUJzuhpZyJnP80vQ4n4tSf9
pqMZtn4kiKcxKn6Typ94L5oDYZyVRlZwYU9LkBogFqFP6AMyZVTXfh00Tr66iFAs
dpsge6K4dPk+MT0GfozUTsIiuJ7bvf2RK9ebzfQrQPEml3NnZQBBEOsPmJRzcmE+
jnPnhGs57iFI7PreEIJ5yxj9KCcivqD4acrOLwIDAQABAoIBACXiYzo7MRnOglbr
fGIXFlQ0tup/vF4e0Lfu1EBoSD4pStPD8vJbFd/VsuZm1n09umx69f5NFR5ToK5l
zry2t9lId+nnUUVFON6JblCtTh3PDPixpQukG0wVxDeJqi7FR3SgZ4bnbyDt4rPp
QuVNFrHLK9rJQLspst5HOlF7Orf5LM4MRqcdC/2/0PqJfts6FmBrhftnMeodrwdT
HnZkOcPbE10/TjLhZwTexyZ/V/IV3TXJR6YG17aNZbMVpjN1d0bN4C4hSF9Aya2W
UEhath+XJdiiT6WCiZNFatCKJPcsmmgshT8/MfuNNfC5lgVRDQu+4fwocigf3dld
NztzFukCgYEA6YH8K5gC33Fyd1VHgD0K3jyz41L5qFBogYDL3xzTnf3p0xsQ1ZKa
FRs3pn9kQDr2rC5umZ8QDOxFVGyJOJ4Bxnw7ixRtNHj21G4hE4EPDr1q7yLIA8fa
ghoQwQr9BcMQ3ikXib+VOf1UVoMxCYa/4SIkIBUihiIO0ZeTqZlzYjMCgYEA2Yg3
aAL4dsUz9yGbHZwmcdiYvGO7b8PbcnRWbCpX3z4/8nd4Gjb55yEzY4CApFdCG1Q+
tpj4bwCfPgLDbRgTpblrg7Liswe4DJUnuGP0lsF/nDzDgwLx464uU7sc9dwcS64r
3m0G9NTemKmx74KQdQcqfjqRP8tGkyCQs7kdQBUCgYAhuFuqD/GaQs+829vPcQE4
xptToI/c9n+g8/B877S/hANYMPhlXx5RHfUTXiIkBF/KzYm7NXUj6Jq6blICkw6+
kwImO3Tptu4uDxlHr8N05XWjwuoPYbT0RL9WoTeYtWqiKlzzz27FSQf81kUmkwby
g/OjjmnF5PUu3yy7uSUocQKBgEkFB4w7iwnbUoE/X6FF3EXU7hg25iEzPoOh96yh
XhPLAo4yejdagvKJ24UoCoaf38nqso56tNIWBF49cTo6ncXAgw2XS6/LBIX8v3OO
4fiFBX/9iad9opLJ0jU7FxKUi08ALSuhr3cZyYq3U8pRKoqOGD59DGq8onkaslgR
6HatAoGAd6zbGjgfLNgLEFp9tq8viOTsHJt+HsoDyN8WbTUOwdk8rObPuQaWqgo6
YQ2e0cz7+5k/Br1LF4IqsLrTwvxewNwvudSPyqNMA/XDyrI4i2go2Wve2w7M1vq1
RYwFADbOa492ramcf79K94FC/XQ7QlegJWqsyQf0q5Saz7TKH38=
-----END RSA PRIVATE KEY-----`;

const rsaPubKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxmtuWLe0poapjNrP7wyh
sPgGCikuQRU7nI+0sj9QBexrt2MtkVwhXdXevHXcR9sA90BkrsfJuzuoZXHA1Yl5
QkW09ws3BolSYeFzvLlU0v6FwP/u7D1vsCah2u0m3CpvnvDiV1Zl2dhC+kqRbp63
+558jUUJzuhpZyJnP80vQ4n4tSf9pqMZtn4kiKcxKn6Typ94L5oDYZyVRlZwYU9L
kBogFqFP6AMyZVTXfh00Tr66iFAsdpsge6K4dPk+MT0GfozUTsIiuJ7bvf2RK9eb
zfQrQPEml3NnZQBBEOsPmJRzcmE+jnPnhGs57iFI7PreEIJ5yxj9KCcivqD4acrO
LwIDAQAB
-----END PUBLIC KEY-----`;

const message = 'Hello World!';

const encryptByPrivKey = (message) => {
  return crypto.privateEncrypt(rsaPrivKey, Buffer.from(message, 'utf8')).toString('base64');
};

const decryptByPubKey = (encryptedMessage) => {
  return crypto.publicDecrypt(rsaPubKey, Buffer.from(encryptedMessage, 'base64')).toString();
};

const encryptByPubKey = (message) => {
  return crypto.publicEncrypt(rsaPubKey, Buffer.from(message, 'utf8')).toString('base64');
};

const decryptByPrivKey = (encryptedMessage) => {
  return crypto.privateDecrypt(rsaPrivKey, Buffer.from(encryptedMessage, 'base64')).toString();
};

const encryptedMessageByPrivKey = encryptByPrivKey(message);
console.log(encryptedMessageByPrivKey);
const decryptedMessageByPupKey = decryptByPubKey(encryptedMessageByPrivKey);
console.log(decryptedMessageByPupKey);

const encryptedMessageByPubKey = encryptByPubKey(message);
console.log(encryptedMessageByPubKey);
const decryptedMessageByPrivKey = decryptByPrivKey(encryptedMessageByPubKey);
console.log(decryptedMessageByPrivKey);