js-ciphers

Node/Pure JavaScript symmetric ciphers adapter

View the Project on GitHub ecies/js-ciphers

@ecies/ciphers

License NPM Package NPM Downloads Install size CI Codecov

Node/Pure JavaScript symmetric ciphers adapter.

If native implementations are available on some platforms (e.g. node, deno, bun), it’ll use node:crypto for efficiency.

Otherwise (e.g. browser, react native), it’ll use @noble/ciphers for compatibility.

  aes chacha
Node node:crypto node:crypto
Bun node:crypto @noble/ciphers
Deno node:crypto @noble/ciphers
Browser @noble/ciphers @noble/ciphers
React Native @noble/ciphers @noble/ciphers

[!NOTE] You may need to polyfill crypto.getRandomValues for React Native.

There are some limitations, see Known limitations below.

This library is tree-shakeable, unused code will be excluded by bundlers.

Check the example folder for bun/deno usage.

Quick start

import { aes256gcm } from "@ecies/ciphers/aes";
import { randomBytes } from "@noble/ciphers/webcrypto";

const TEXT = "hello world🌍!";
const encoder = new TextEncoder();
const decoder = new TextDecoder();
const msg = encoder.encode(TEXT);

const key = randomBytes();
const nonce = randomBytes(16);
const cipher = aes256gcm(key, nonce);
console.log("decrypted:", decoder.decode(cipher.decrypt(cipher.encrypt(msg))));

The API follows @noble/ciphers’s API for ease of use, you can check their examples as well.

Supported ciphers

If key is fixed and nonce is less than 16 bytes, avoid randomly generated nonce.

Known limitations