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

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

crypto.createDecipheriv()は、Node.jsの「crypto」モジュールが提供するプログラミングインターフェースの一つです。指定されたアルゴリズム、鍵(キー)、初期化ベクトル(iv)、およびオプションに基づいてDecipher(復号)オブジェクトを作成し、返します。暗号化されたデータを元の平文に戻す際に使われる、非常に重要なメソッドです。

構文

crypto.createDecipheriv(algorithm, key, iv, [options])

パラメータ

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

  • algorithm – 暗号の作成に使用するアルゴリズムを指定します。指定可能な値には「aes192」「aes256」などがあります。

  • key – アルゴリズムおよびivで使用される生の鍵を指定します。string、Buffer、TypedArray、DataView型の値が指定でき、必要に応じてKeyObject形式の秘密鍵オブジェクトを渡すことも可能です。

  • iv – 初期化ベクトル(Initialization Vector)とも呼ばれるパラメータです。暗号文を一意かつ予測困難なものにするための値で、秘密情報である必要はありません。string、Buffer、TypedArray、DataView型が指定可能で、使用するアルゴリズムがivを必要としない場合はnullを設定することもできます。

  • options – ストリームの動作を制御するための任意パラメータです。ただし、CCMやOCBモード(例:「aes-256-ccm」)を使用する場合には省略できず、必須となります。

使用例1

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

node createDecipheriv.js

createDecipheriv.js

// ECDH作成のためのNodeデモプログラム

// cryptoモジュールを読み込む
const crypto = require('crypto');

// アルゴリズムを初期化
const algorithm = 'aes-192-cbc';

// パスワードを定義・初期化
const password = '123456789'

// 鍵を初期化
const key = crypto.scryptSync(password, 'TutorialsPoint', 24);

// ivベクトルを初期化
const iv = Buffer.alloc(16, 0);

// 上記のパラメータを使ってDecipher(復号オブジェクト)を作成
const decipher = crypto.createDecipheriv(algorithm, key, iv);

let decrypted = '';

// データを読み込みながら復号する
decipher.on('readable', () => {
    let chunk;
    while (null !== (chunk = decipher.read())) {
        decrypted += chunk.toString('utf8');
    }
});

// 終了イベントのハンドリング
decipher.on('end', () => {
    console.log(decrypted);
});

// 復号対象となる暗号化済みデータ
const encrypted = 'uqeQEkXy5dpJjQv+JDvMHw==';
// 復号されたテキストを出力
decipher.write(encrypted, 'base64');
decipher.end();
console.log("Completed... !");

出力

C:\home\node>> node createDecipheriv.js
Completed... !
TutorialsPoint

使用例2

続いて、もう一つの例を見てみましょう。こちらではaes-256-cbcを用いて、暗号化と復号の両方を行う実践的なサンプルを紹介します。

// cryptoモジュールを読み込む
const crypto = require('crypto');

// アルゴリズムを初期化
const algorithm = 'aes-256-cbc';

// パスワードを定義・初期化
const password = '123456789'

// ランダムな鍵を生成して初期化
const key = crypto.randomBytes(32);

// ランダムなivベクトルを生成
const iv = crypto.randomBytes(16);

// データを暗号化する関数
function encrypt(text) {

  // 上記のパラメータでCipher(暗号オブジェクト)を作成
  let cipher =
    crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);

  // 暗号化処理を実行
  let encrypted = cipher.update(text);

  // バッファを連結
  encrypted = Buffer.concat([encrypted, cipher.final()]);

  // ivベクトルと暗号化データをセットで返す
  return { iv: iv.toString('hex'),
    encryptedData: encrypted.toString('hex') };
}

// データを復号する関数
function decrypt(text) {

  let iv = Buffer.from(text.iv, 'hex');
  let encryptedText =
    Buffer.from(text.encryptedData, 'hex');

  // アルゴリズム・鍵・ivからdecipherを作成
  let decipher = crypto.createDecipheriv(
    'aes-256-cbc', Buffer.from(key), iv);

  // 復号処理を実行
  let decrypted = decipher.update(encryptedText);
  decrypted = Buffer.concat([decrypted, decipher.final()]);

  // 復号後のデータを文字列として返す
  return decrypted.toString();
}

// データを暗号化して結果を出力
var output = encrypt("Welcome to TutorialsPoint !");
console.log("Encrypted data -- ", output);

// 復号結果を出力
console.log("Decrypted data -- ", decrypt(output));

出力

C:\home\node>> node createDecipheriv.js
Encrypted data -- { iv: '3fb2c84290e04d9bfb099bc65a7ac941',
encryptedData:
'4490777e90c5a78037cb92a99d561ae250562e2636af459b911cfa01c0191e3f' }
Decrypted data -- Welcome to TutorialsPoint !

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