node-rsa の使い方 | NodeJS のための RSA 暗号モジュール
前提
- NodeJS:
v20.12.2
- NPM:
10.5.0
- モジュールシステム:
CJS
- モジュールバージョン:
node-rsa@1.1.1
インストール
npm i 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 形式のキーペアを生成して文字列として取得する例
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-pem
や pkcs1-public-pem
は独自のフォーマット指定文字列。
詳しいフォーマット指定方法については、フォーマット指定方法 を参照。
暗号鍵の形式変換
保有している openssh 形式の秘密鍵を pkcs1 形式に変換する例
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}
とハイフンでつないだ文字列で指定する。なお、KeyType
と OutputType
は省略することができる。
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