Node.jsのcrypto.privateDecrypt()メソッドの使い方を徹底解説
crypto.privateDecrypt()メソッドは、crypto.publicEncrypt()メソッドを使って対応する公開鍵で事前に暗号化されたデータを、パラメータとして渡された秘密鍵を用いて復号するために使用されます。RSA暗号方式などの公開鍵暗号システムにおいて、安全なデータ復号を実現するための重要なAPIです。
構文
crypto.privateDecrypt(privateKey, buffer)
パラメータ
このメソッドが受け取る各パラメータの詳細は以下のとおりです。
privateKey(秘密鍵) – 復号に使用する秘密鍵を指定します。Object、String、Buffer、KeyObjectのいずれかの型で渡すことができます。オブジェクト形式の場合は、以下のプロパティを指定できます。
key – PEM形式などでエンコードされた秘密鍵本体。
oaepHash – OAEPパディングおよびMGF1に使用するハッシュ関数を指定します。デフォルト値は「'sha1'」です。
oaepLabel – OAEPパディングに使用するラベルを指定します。省略した場合はラベルは使用されません。
padding – crypto.constantsで定義されている任意のパディング値を指定します(例:crypto.constants.RSA_PKCS1_OAEP_PADDING)。
passphrase – 秘密鍵が暗号化されて保護されている場合に必要となるパスフレーズ。
buffer – 復号対象のデータ内容を指定します。指定できる型は、string、TypedArray、Buffer、ArrayBuffer、DataViewです。
基本的な使用例
まず「privateDecrypt.js」という名前のファイルを作成し、以下のコードをコピーしてください。ファイル作成後、次のコマンドでコードを実行できます。
node privateDecrypt.js
privateDecrypt.js
// crypto.privateDecrypt()メソッドの動作を示すNode.jsプログラム
// cryptoモジュールとfsモジュールを読み込む
const crypto = require('crypto');
const fs = require("fs");
// 公開鍵を読み込む
// 鍵はgenerateKeyPair()メソッドで生成できる
publicKey = fs.readFileSync('public_key').toString();
// 暗号化するテキストをBufferとして用意
var buf = Buffer.from('Hello TutorialsPoint', 'utf8');
// 上記のテキストを公開鍵で暗号化
secretData = crypto.publicEncrypt(publicKey, buf);
// 暗号化されたテキストを出力
console.log(secretData);
// 秘密鍵を読み込む
privateKey = fs.readFileSync('private_key').toString();
// 暗号化されたテキストを秘密鍵で復号
origData = crypto.privateDecrypt(privateKey, secretData);
console.log();
// 元のテキストをBufferとして出力
console.log(origData);
出力結果
C:\home\node>> node privateDecrypt.js <Buffer 15 4b 51 02 e7 1c ec 11 20 55 ee 92 b2 18 7b ce f1 e1 97 bd b7 0d 54 21 18 ea 0c e7 cd 51 36 f5 13 df fb 41 c1 63 bb ac ee 94 12 df f6 d6 04 b1 9c 11 ... > <Buffer 48 65 6c 6c 6f 20 54 75 74 6f 72 69 61 6c 73 50 6f 69 6e 74>
上記の出力では、最初のBufferが公開鍵で暗号化されたデータ、2つ目のBufferが復号後の元のテキスト(16進数表現)を示しています。「Hello TutorialsPoint」が正しく復元されていることが分かります。
鍵ペアを生成して使う実践的な例
続いて、generateKeyPairSync()メソッドで鍵ファイルを動的に生成し、暗号化から復号までの一連の流れを確認する例を見てみましょう。
// crypto.privateDecrypt()メソッドの動作を示すNode.jsプログラム
// cryptoモジュールとfsモジュールを読み込む
const crypto = require('crypto');
const fs = require("fs");
// generateKeyPairSync()メソッドで鍵ファイルを生成する関数
function generateKeyFiles() {
const keyPair = crypto.generateKeyPairSync('rsa', {
modulusLength: 530,
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();
// 渡された文字列を公開鍵で暗号化する関数
function encryptString(plaintext, publicKeyFile) {
const publicKey = fs.readFileSync(publicKeyFile, "utf8");
// publicEncrypt()メソッドと公開鍵を使ってデータを暗号化
const encrypted = crypto.publicEncrypt(
publicKey, Buffer.from(plaintext));
return encrypted.toString("base64");
}
// 渡された文字列を秘密鍵で復号する関数
function decryptString(ciphertext, privateKeyFile) {
const privateKey = fs.readFileSync(privateKeyFile, "utf8");
// privateDecrypt()メソッドと対応する秘密鍵を使ってデータを復号
const decrypted = crypto.privateDecrypt(
{
key: privateKey,
passphrase: '',
},
Buffer.from(ciphertext, "base64")
);
return decrypted.toString("utf8");
}
// 暗号化・復号の対象となるデータ
const plainText = "TutorialsPoint!";
// 文字列を暗号化するメソッドを呼び出す
const encrypted = encryptString(plainText, "./public_key");
// 平文を出力
console.log("Plaintext:", plainText);
console.log();
// 暗号化されたテキストを出力
console.log("Encrypted Text: ", encrypted);
console.log();
// 復号されたテキストを出力
console.log("Decrypted Text: ",
decryptString(encrypted, "private_key"));
出力結果
C:\home\node>> node privateDecrypt.js Plaintext: TutorialsPoint! Encrypted Text: AbSrqG4qFBG1q9KUBt8ddJxk9uNanOHXqY19N0mNHx0fm4M119dZVhcNrAvM8UaIRJvh7AsdWyjv1s cPA25KpeJuJQ== Decrypted Text: TutorialsPoint!
この例では、平文「TutorialsPoint!」がBase64形式の暗号文に変換され、その後privateDecrypt()メソッドによって元のテキストへ正しく復号されていることが確認できます。
利用時の注意点
秘密鍵がパスフレーズで保護されている場合は、オブジェクト形式でpassphraseを必ず指定する必要があります。
publicEncrypt()側でOAEPパディングを使用して暗号化した場合は、privateDecrypt()側でも同じパディングとハッシュ関数を指定しないと復号に失敗します。
サンプルコードのmodulusLength(530)は学習用の小さな値です。本番環境では2048以上の鍵長を使用することが強く推奨されます。
-
Node.jsのcrypto.privateEncrypt()メソッドの使い方と解説
Node.jsのcrypto.privateEncrypt()メソッドは、関数に渡された秘密鍵を使って、指定したデータを暗号化するためのメソッドです。秘密鍵による暗号化が必要な場面、たとえばデジタル署名の生成などでよく利用されます。 構文 crypto.privateEncrypt(privateKey, buffer) パラメータ 各パラメータの詳細は以下の通りです。 privateKey – Object、String、Buffer、KeyObjectのいずれかの型を指定できます。 key – PEM形式でエンコードされた秘密鍵です。Stri
-
Node.jsのcrypto.getHashes()メソッドとは?使い方とサポートされるハッシュアルゴリズム一覧の取得方法
crypto.getHashes()メソッドは、Node.jsでサポートされているすべてのハッシュアルゴリズムの名前を配列形式で返します。cryptoモジュールには非常に多くのハッシュアルゴリズムが用意されており、その中でも歴史的によく使われてきたのが「MD5(Message-Digest Algorithm 5)」です。ただし、MD5には衝突耐性の脆弱性があるため、現在ではセキュリティ用途にはSHA-256やSHA3系など、より強力なアルゴリズムを使うことが推奨されています。 構文 crypto.getHashes() 引数(パラメータ) このメソッドは、サポートされているハッシュアルゴ