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

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

crypto.publicEncrypt()は、Node.jsのcryptoモジュールに含まれる暗号化用メソッドです。パラメータとして渡された公開鍵を使って、bufferで指定したデータを暗号化します。暗号化されたデータは、ペアとなる秘密鍵を用いることで復号できます。

この仕組みはRSA暗号方式に基づいており、公開鍵で暗号化したデータは対応する秘密鍵を持つ者だけが復号できるため、安全なデータ通信を実現する際に広く活用されています。

構文(シンタックス)

crypto.publicEncrypt(key, buffer)

パラメータ

このメソッドが受け取るパラメータは以下の通りです。

  • key ― 暗号化に使用する鍵情報です。Object、String、Buffer、KeyObjectのいずれかの型を指定できます。オブジェクト形式の場合、以下のプロパティを設定できます。

    • key ― PEM形式でエンコードされた公開鍵または秘密鍵。String、Buffer、KeyObject型が指定可能です。

    • oaepHash ― OAEPパディングおよびMGF1に使用するハッシュ関数。デフォルト値は 'sha1' です。

    • oaepLabel ― OAEPパディングに使用するラベルの値。指定しない場合はラベルなしで処理されます。

    • passphrase ― 秘密鍵のパスフレーズ(任意)。秘密鍵が暗号化されている場合に指定します。

    • paddingcrypto.constants で定義されているパディング方式(任意)。例えば RSA_PKCS1_OAEP_PADDING などがあります。

    • encoding ― buffer、key、oaepLabel、passphrase の値が文字列である場合に使用されるエンコーディングの種類。

  • buffer ― 暗号化対象のデータ本体。String、TypedArray、Buffer、ArrayBuffer、DataView型が指定できます。

使用例1:文字列をBase64形式で暗号化する

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

node publicEncrypt.js

publicEncrypt.js

// crypto.publicEncrypt() メソッドの動作を示すNode.jsプログラム

// cryptoモジュールとfsモジュールを読み込む
const crypto = require('crypto');
const 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);
}
// 鍵ペアを生成
generateKeyFiles();

// 文字列を暗号化する関数
function encryptString (plaintext, publicKeyFile) {
    const publicKey = fs.readFileSync(publicKeyFile, "utf8");

    // publicEncrypt() を呼び出して暗号化
    const encrypted = crypto.publicEncrypt(
      publicKey, Buffer.from(plaintext));
    return encrypted.toString("base64");
}

// 暗号化する平文
const plainText = "TutorialsPoint";

// 暗号化テキストを取得
const encrypted = encryptString(plainText, "./public_key");

// 平文を出力
console.log("Plaintext:", plainText);

// 暗号化テキストを出力
console.log("Encrypted: ", encrypted);

実行結果

C:\home\node>> node publicEncrypt.js
Plaintext: TutorialsPoint
Encrypted:
kgnqPxy/n34z+/5wd7MZiMAL5LrQisTLfZiWoSChXSvxgtifMQaZ56cbF+twA55olM0rFfnuV6qqtc
a8SXIHQrk=

この例では、生成したRSA鍵ペアの公開鍵を使って「TutorialsPoint」という文字列を暗号化し、結果をBase64形式の文字列として出力しています。

使用例2:Buffer形式で暗号化結果を取得する

続いて、暗号化結果をそのままBufferオブジェクトとして受け取る例を見てみましょう。

// crypto.publicEncrypt() メソッドの動作を示すNode.jsプログラム

// cryptoモジュールとfsモジュールを読み込む
const crypto = require('crypto');
const 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);
}

// 鍵ペアを生成
generateKeyFiles();

// 文字列を暗号化する関数
function encryptString (plaintext, publicKeyFile) {
    const publicKey = fs.readFileSync(publicKeyFile, "utf8");

    // publicEncrypt() を呼び出して暗号化
    const encrypted = crypto.publicEncrypt(
      publicKey, Buffer.from(plaintext));
    return encrypted;
}

// 暗号化する平文
const plainText = "Hello TutorialsPoint!";

// 暗号化テキストを取得
const encrypted = encryptString(plainText, "./public_key");

// 平文を出力
console.log("Plaintext:", plainText);

// 暗号化されたバッファを出力
console.log("Buffer: ", encrypted);

実行結果

C:\home\node>> node publicEncrypt.js
Plaintext: Hello TutorialsPoint!
Buffer: <Buffer 33 0b 54 96 0e 8f 34 6c b4 d5 7a cf d4 d5 ef 7b 7e c5 ec 97
cf 75 05 07 df 5a 9e d4 3d cc 3e bb 55 e7 50 1b 64 f0 c8 89 19 61 81 99 e5 88
10 4a 3b 5a ... >

このように、toString("base64")を呼ばずに戻り値をそのまま利用すると、暗号化データがBufferオブジェクト(バイナリデータ)として得られます。用途に応じて、Base64文字列やBuffer形式を使い分けるとよいでしょう。

まとめ

crypto.publicEncrypt()は、公開鍵暗号方式によるデータ暗号化を手軽に実装できる便利なメソッドです。鍵ペアの生成にはcrypto.generateKeyPairSync()を組み合わせるのが一般的で、暗号化したデータはcrypto.privateDecrypt()と秘密鍵を使って復号できます。API通信や機密データの保護など、セキュリティが必要な場面でぜひ活用してみてください。

  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() 引数(パラメータ) このメソッドは、サポートされているハッシュアルゴ