JSEncrypt

raw JSON →
1.0.4 verified Sat Apr 25 auth: no javascript

JSEncrypt for node & browser. Version 1.0.4 provides RSA encryption/decryption using the JSEncrypt library, compatible with both Node.js and browser environments. It is a fork of the original JSEncrypt by Apipost. The library allows setting public/private keys in PEM format and uses the RSA algorithm. It is suitable for basic RSA operations but note it is a thin wrapper around the original JSEncrypt. No recent updates; release cadence is low.

error Error: JSEncrypt is not a constructor
cause Using CommonJS require without .default
fix
Use const JSEncrypt = require('jsencrypt-node').default;
error TypeError: this.key is undefined
cause setPublicKey or setPrivateKey called with invalid PEM or not called at all
fix
Ensure the PEM string is correct and includes BEGIN/END lines with no extra whitespace.
error false
cause Decrypt method returns false when decryption fails (e.g., wrong key, corrupted ciphertext)
fix
Verify the key matches the encryption key and the ciphertext is valid Base64.
gotcha Private key must be in PKCS#1 PEM format (RSA PRIVATE KEY), not PKCS#8 (PRIVATE KEY).
fix Convert PKCS#8 keys to PKCS#1 using openssl rsa -in key.pem -out pkcs1.pem
gotcha Decrypt method may return false if the encrypted string is invalid or key does not match.
fix Check the return value: if (decrypted === false) { /* handle error */ }
gotcha Encrypted output is Base64-encoded, not raw binary. Do not assume hex.
fix Use ciphertext as-is for Base64; if you need hex, convert via Buffer.
npm install jsencrypt-node
yarn add jsencrypt-node
pnpm add jsencrypt-node

Demonstrates RSA encryption and decryption using JSEncrypt with public and private PEM keys.

import JSEncrypt from 'jsencrypt-node';

const encrypt = new JSEncrypt();
encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1QQRl0HlrVv6kGqhgonD6A9SU6ZJpnEN+Q0blT/ue6Ndt97WRfxtSAs0QoquTreaDtfC4RRX4o+CU6BTuHLUm+eSvxZS9TzbwoYZq7ObbQAZAY+SYDgAA5PHf1wNN20dGMFFgVS/y0ZWvv1UNa2laEz0I8Vmr5ZlzIn88GkmSiQIDAQAB-----END PUBLIC KEY-----');
const cipher = encrypt.encrypt('Hello, world!');
console.log(cipher);

const decrypt = new JSEncrypt();
decrypt.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQC1QQRl0HlrVv6kGqhgonD6A9SU6ZJpnEN+Q0blT/ue6Ndt97WRfxtSAs0QoquTreaDtfC4RRX4o+CU6BTuHLUm+eSvxZS9TzbwoYZq7ObbQAZAY+SYDgAA5PHf1wNN20dGMFFgVS/y0ZWvv1UNa2laEz0I8Vmr5ZlzIn88GkmSiQIDAQABAoGBAKYDKP4AFlXkVlMEP5hS8FtuSrUhwgKNJ5xsDnFV8sc3yKlmKp1a6DETc7N66t/Wdb3JVPPSAy+7GaYJc7IsBRZgVqhrjiYiTO3ZvJv3nwAT5snCoZrDqlFzNhR8zvUiyAfGD1pExBKLZKNH826dpfoKD2fYlBVOjz6i6dTKBvCJAkEA/GtL6q1JgGhGLOUenFveqOHJKUydBAk/3jLZksQqIaVxoB+jRQNOZjeSO9er0fxgI2kh0NnfXEvH+v326WxjBwJBALfTRar040v71GJq1m8eFxADIiPDNh5JD2yb71FtYzH9J5/d8SUHI/CUFoROOhxr3DpagmrnTn28H0088vubKe8CQDKMOhOwx/tS5lqvN0YQj7I6JNKEaR0ZzRRuEmv1pIpAW1S5gTScyOJnVn1tXxcZ9xagQwlT2ArfkhiNKxjrf5kCQAwBSDN5+r4jnCMxRv/Kv0bUbY5YWVhw/QjixiZTNn81QTk3jWAVr0su4KmTUkg44xEMiCfjI0Ui3Ah3SocUAxECQAmHCjy8WPjhJN8y0MXSX05OyPTtysrdFzm1pwZNm/tWnhW7GvYQpvE/iAcNrNNb5k17fCImJLH5gbdvJJmCWRk=-----END RSA PRIVATE KEY-----');
const plain = decrypt.decrypt(cipher);
console.log(plain);