JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

Node.jsのcrypto.publicDecrypt()メソッドの使い方を徹底解説

crypto.publicDecrypt()とは

crypto.publicDecrypt()メソッドは、公開鍵(パブリックキー)を使用して、指定されたバッファ内のデータを復号化するために使用されます。このバッファデータは、事前に対応する秘密鍵(プライベートキー)、すなわちcrypto.privateEncrypt()メソッドによって暗号化されている必要があります。

一般的なRSA暗号の利用では「公開鍵で暗号化し、秘密鍵で復号化する」のが通常ですが、このメソッドは逆に秘密鍵で暗号化したデータを公開鍵で復号化するという、デジタル署名の検証に近い性質を持つ点が特徴です。

構文

crypto.publicDecrypt(key, buffer)

パラメータ

各パラメータの詳細は以下のとおりです。

  • key – Object、String、Buffer、KeyObjectのいずれかの型を取ります。オブジェクト形式の場合、以下のプロパティを含めることができます。

    • passphrase – 秘密鍵用のパスフレーズ(省略可能)。文字列またはBufferで指定します。

    • padding – crypto.constantsで定義されているパディング方式の値(省略可能)。RSA_PKCS1_PADDINGやRSA_PKCS1_OAEP_PADDINGなどを指定できます。

    • encoding – buffer、key、oaepLabel、passphraseの各値が文字列である場合に使用するエンコーディングの種類(省略可能)。

  • buffer – 復号化対象のデータ内容を格納します。指定できる型は、String、TypedArray、Buffer、ArrayBuffer、DataViewです。

サンプルコード1

まず「publicDecrypt.js」という名前のファイルを作成し、以下のコードをコピーしてください。ファイル作成後、次のコマンドでコードを実行します。

node publicDecrypt.js

publicDecrypt.js

// crypto.publicDecrypt デモ例

// crypto、fs、pathモジュールを読み込み
var crypto = require('crypto');
var fs = require('fs');
const path = require('path');

// 鍵ペアを生成する関数
function generateKeyFiles() {

    const keyPair = crypto.generateKeyPairSync('rsa', {
       modulusLength: 520,
       publicKeyEncoding: {
           type: 'spki',
           format: 'pem'
       },
       privateKeyEncoding: {
           type: 'pkcs8',
           format: 'pem',
           cipher: 'aes-256-cbc',
           passphrase: ''
       }
    });

    // 公開鍵・秘密鍵をそれぞれファイルに保存
    fs.writeFileSync("public_key", keyPair.publicKey);
    fs.writeFileSync("private_key", keyPair.privateKey);
}

// 鍵生成関数を呼び出し
generateKeyFiles();

// 秘密鍵と公開鍵を読み込む
var private = fs.readFileSync('private_key');
var public = fs.readFileSync('public_key');

// 元のデータを定義
var data = 'Welcome to TutorialsPoint';
console.log("元のデータ: " + data);

// 秘密鍵でデータを暗号化
encrypted = crypto.privateEncrypt(private, Buffer.from(data, 'utf8')).toString('base64');

// 公開鍵でデータを復号化
originalData = crypto.publicDecrypt(public, Buffer.from(encrypted, 'base64'));

console.log();

// 暗号化後のメッセージを表示
console.log("秘密鍵で暗号化されたデータ: " + encrypted);

console.log();

// 復号化後のメッセージを表示
console.log("公開鍵で復号化されたデータ: " + originalData.toString());

実行結果

C:\home\node>> node publicDecrypt.js
元のデータ: Welcome to TutorialsPoint

秘密鍵で暗号化されたデータ:
EFBihrKebXb0gfCF7nTnw82yXpToH5eVBpLc8O5QL/ZgfZ/qJT5I/BejSMwV4NFCp+AIKnz2lrjmFh
IhnpZWbF4=

公開鍵で復号化されたデータ: Welcome to TutorialsPoint

この例では、秘密鍵で暗号化したデータが、対応する公開鍵を使うことで元のテキストへ正しく復号化できていることが確認できます。

サンプルコード2

続いて、Bufferオブジェクトの状態を段階的に確認できるもう一つの例を見てみましょう。

// crypto.publicDecrypt デモ例

// cryptoモジュールとfsモジュールを読み込み
var crypto = require('crypto');
var fs = require('fs');

// 鍵ペアを生成する関数
function generateKeyFiles() {

    const keyPair = crypto.generateKeyPairSync('rsa', {
       modulusLength: 520,
       publicKeyEncoding: {
           type: 'spki',
           format: 'pem'
       },
       privateKeyEncoding: {
           type: 'pkcs8',
           format: 'pem',
           cipher: 'aes-256-cbc',
           passphrase: ''
       }
    });

    // 公開鍵・秘密鍵をそれぞれファイルに保存
    fs.writeFileSync("public_key", keyPair.publicKey);
    fs.writeFileSync("private_key", keyPair.privateKey);
}

// 鍵生成関数を呼び出し
generateKeyFiles();

// 秘密鍵を読み込む
privateKey = fs.readFileSync('private_key').toString();
var buffer = Buffer.from('Welcome to TutorialsPoint', 'utf8');
console.log("暗号化前のデータバッファ")
console.log(buffer);

// バッファのテキストを暗号化
encrypted = crypto.privateEncrypt(privateKey, buffer);

// 暗号化後のデータを表示
console.log("暗号化後のデータ: ");
console.log(encrypted);

// 公開鍵を読み込む
publicKey = fs.readFileSync('public_key').toString();

// 公開鍵を使って暗号文を復号化
decryptedData = crypto.publicDecrypt(publicKey, encrypted);

// 元の内容を表示
console.log("復号化後のデータ: ");
console.log(decryptedData);

実行結果

C:\home\node>> node publicDecrypt.js
暗号化前のデータバッファ
<Buffer 57 65 6c 63 6f 6d 65 20 74 6f 20 54 75 74 6f 72 69 61 6c 73 50 6f 69
6e 74>
暗号化後のデータ:
<Buffer a6 9d e3 86 9f 3f 4b b9 3f f7 a6 9c 7c 16 0f 04 b9 c4 16 0b 08 f1 06
39 de 32 75 7c 26 88 fa 49 bd 31 6b 4b 4d 02 e6 87 56 ee 9c 95 53 10 8f 28 49
f5 ... >
復号化後のデータ:
<Buffer 57 65 6c 63 6f 6d 65 20 74 6f 20 54 75 74 6f 72 69 61 6c 73 50 6f 69
6e 74>

実行結果から、暗号化によってバイト列が大きく変化している一方、公開鍵による復号化後に元のバッファ内容が完全に再現されていることが分かります。

まとめ

crypto.publicDecrypt()は、crypto.privateEncrypt()で秘密鍵により暗号化されたデータを、公開鍵で復号化するためのメソッドです。この仕組みはデジタル署名の作成・検証の基礎となるものであり、Node.jsでRSA暗号を扱う際に重要な役割を果たします。なお、本記事のサンプルでは処理を高速化するために短い鍵長(520ビット)を使用していますが、実際のアプリケーションでは安全性を確保するため、2048ビット以上の鍵長を使用することが強く推奨されます。

  1. Node.jsのcrypto.privateDecrypt()メソッドの使い方を徹底解説

    crypto.privateDecrypt()メソッドは、crypto.publicEncrypt()メソッドを使って対応する公開鍵で事前に暗号化されたデータを、パラメータとして渡された秘密鍵を用いて復号するために使用されます。RSA暗号方式などの公開鍵暗号システムにおいて、安全なデータ復号を実現するための重要なAPIです。 構文 crypto.privateDecrypt(privateKey, buffer) パラメータ このメソッドが受け取る各パラメータの詳細は以下のとおりです。 privateKey(秘密鍵) – 復号に使用する秘密鍵を指定します。Object、String、Bu

  2. Node.jsのcrypto.getHashes()メソッドとは?使い方とサポートされるハッシュアルゴリズム一覧の取得方法

    crypto.getHashes()メソッドは、Node.jsでサポートされているすべてのハッシュアルゴリズムの名前を配列形式で返します。cryptoモジュールには非常に多くのハッシュアルゴリズムが用意されており、その中でも歴史的によく使われてきたのが「MD5(Message-Digest Algorithm 5)」です。ただし、MD5には衝突耐性の脆弱性があるため、現在ではセキュリティ用途にはSHA-256やSHA3系など、より強力なアルゴリズムを使うことが推奨されています。 構文 crypto.getHashes() 引数(パラメータ) このメソッドは、サポートされているハッシュアルゴ