😎

node-rsa の使い方 | NodeJS のための RSA 暗号モジュール

2024/06/13に公開

前提

  • NodeJS: v20.12.2
  • NPM: 10.5.0
  • モジュールシステム: CJS
  • モジュールバージョン: node-rsa@1.1.1

インストール

npm i node-rsa

https://github.com/rzcoder/node-rsa

使い方

インスタンスの生成

次のように、引数を渡さない場合、Empty なキーが生成され、暗号化/複合化にはキーの生成やインポートが別途必要になる。

const key = new NodeRSA();

なお、インスタンス生成後に鍵を生成するには、key.generateKeyPair([bits], [exp]) を使う。
bits — {int} — key size in bits. 2048 by default.
exp — {int} — public exponent. 65537 by default.

次のように引数を渡すと、鍵長を指定して、インスタンスの生成とともに暗号鍵のペアが生成される。キーの生成やインポートは不要。

const key = new NodeRSA({ b: 512 });

暗号鍵の pem (文字列) をすでに保有している場合は、次のように引数を渡すことで、インスタンスの生成とともに、キーをインポートすることができる。鍵の形式はおそらく自動判別される。

const key = new NodeRSA('-----BEGIN RSA PRIVATE KEY-----...');

暗号鍵の生成

pkcs1 形式のキーペアを生成して文字列として取得する例

index.js
const NodeRSA = require('node-rsa');

// 鍵長 512bit で生成
const key = new NodeRSA({ b: 512 });
// 指定のフォーマットでエクスポート
const priv = key.exportKey('pkcs1-private-pem');
const pub = key.exportKey('pkcs1-public-pem');
console.log(priv); // -> '-----BEGIN RSA PRIVATE KEY-----...'
console.log(pub); // -> '-----BEGIN RSA PUBLIC KEY-----...'

pkcs1-private-pempkcs1-public-pem は独自のフォーマット指定文字列。
詳しいフォーマット指定方法については、フォーマット指定方法 を参照。

暗号鍵の形式変換

保有している openssh 形式の秘密鍵を pkcs1 形式に変換する例

index.js
const NodeRSA = require('node-rsa');

// Empty Key 作成
const key = new NodeRSA();
// インポートする Private Key 
const privKey = '-----BEGIN OPENSSH PRIVATE KEY-----...';
// インポートするフォーマットを指定してインポート
key.importKey(privKey, 'openssh-private-pem');
// フォーマットを変換して表示
console.log(key.exportKey('pkcs1-private-pem'));
// -> '-----BEGIN RSA PRIVATE KEY-----...'

フォーマット指定については、フォーマット指定方法 を参照。

暗号鍵の生成と文字列の暗号化/複合化

秘密鍵と公開鍵を生成して文字列の暗号化と複合化をする例

const NodeRSA = require('node-rsa');
const TEXT = 'Hello World!!';

// 鍵長 512bit で生成
const key = new NodeRSA({ b: 512 });

// 生成された公開鍵で暗号化し Base 64 エンコード
const cipher = key.encrypt(TEXT, 'base64');
console.log(cipher); // -> RxVJ5HfYG9...
// 生成された秘密鍵で複合化し UTF-8 エンコード
const plain = key.decrypt(cipher, 'utf8');
console.log(plain); // ->  Hello World!!

公開鍵で暗号化する際には key.encrypt() を利用しているが、秘密鍵で暗号化する際には key.encryptPrivate() を使う。
また、秘密鍵で複合化する際には key.decrypt() を利用しているが、公開鍵で複合化する際には key.decryptPublic() を使う。

秘密鍵のインポートと暗号文の複合化

保有している秘密鍵をインポートして、暗号文を複合化する例

const NodeRSA = require('node-rsa');
// 秘密鍵
const PRIV = '-----BEGIN RSA PRIVATE KEY-----...';
// 暗号文
const CIPHER = 'VDLgGtkNLbHFIKm...==';

const key = new NodeRSA();
// 秘密鍵をインポート
key.importKey(PRIV, 'pkcs1-private-pem');
// 複合化して UTF-8 エンコード
const plain = key.decrypt(CIPHER, 'utf8');
console.log(plain); // -> Hello World!!

秘密鍵で複合化する際には key.decrypt() を利用しているが、公開鍵で複合化する際には key.decryptPublic() を使う。

フォーマット指定方法

NodeRSA では、RSA 鍵のフォーマットを指定するための、共通のフォーマット指定方法を用いる。
これを使用して、例えば exportKey メソッドは、鍵を指定のフォーマットでエクスポートすることができる。フォーマット指定方法は pkcs1-private-pem のように、{Schema}-{KeyType}-{OutputType}とハイフンでつないだ文字列で指定する。なお、KeyTypeOutputType は省略することができる。

Schema

  • pkcs1: -----BEGIN RSA PUBLIC KEY----------BEGIN RSA PRIVATE KEY----- で始まる。
  • pkcs8: -----BEGIN PUBLIC KEY----------BEGIN PRIVATE KEY----- で始まる。
  • openssh: ssh-rsa-----BEGIN OPENSSH PRIVATE KEY----- で始まる。
  • components: いろんな情報が入った特殊スキーマ。

KeyType

  • public
  • private (デフォルト)

OutputType

  • pem (デフォルト): 鍵を Base 64 エンコードし、そこにヘッダーやフッターを付けた文字列。
  • der: Buffer オブジェクト。

Discussion