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.
Common errors
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.
Warnings
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.
Install
npm install jsencrypt-node yarn add jsencrypt-node pnpm add jsencrypt-node Imports
- JSEncrypt wrong
const JSEncrypt = require('jsencrypt-node')correctimport JSEncrypt from 'jsencrypt-node' - JSEncrypt wrong
const JSEncrypt = require('jsencrypt-node')correctconst JSEncrypt = require('jsencrypt-node').default - JSEncrypt
const { JSEncrypt } = require('jsencrypt-node')
Quickstart
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);