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

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

Node.jsのdecipher.final()メソッドは、decipherオブジェクトが保持する残りのデータを含むバッファ(Buffer)または文字列を返すために使用されます。このメソッドは、cryptoモジュールのDecipherクラスに組み込まれているメソッドの1つです。

重要な注意点として、decipher.final()メソッドを一度呼び出した後は、同じdecipherオブジェクトでそれ以上データを復号化することはできません。また、final()メソッドを複数回呼び出すとエラーがスローされます。

構文

decipher.final([outputEncoding])

パラメータ

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

  • outputEncoding – 出力データのエンコーディングを指定します。文字列型のパラメータで、hex、base64、utf8などの値を指定できます。省略した場合はBufferオブジェクトが返されます。

戻り値

outputEncodingを指定した場合は文字列が、指定しなかった場合はBufferオブジェクトが返されます。この戻り値には、復号化処理の最後に残されたデータが含まれています。

例1

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

node decipherFinal.js

decipherFinal.js

// decipher.final()メソッドの使用例

// cryptoモジュールのインポート
const crypto = require('crypto');

// AESアルゴリズムの初期化
const algorithm = 'aes-192-cbc';
// 鍵の生成に使用するパスワード
const password = '12345678123456789';

// decipherオブジェクト用の鍵を取得
const key = crypto.scryptSync(password, 'old data', 24);

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

const decipher = crypto.createDecipheriv(algorithm, key, iv);

// 復号化対象の暗号文
const encrypted1 =
'a05e87569f3f04234812ae997da5684944c32b8776fae676b4abe9074b31cd2a';

// update()メソッドで暗号文を復号化
let decryptedValue1 = decipher.update(encrypted1, 'hex', 'utf8');

// final()メソッドで残りのデータを取得して連結
decryptedValue1 += decipher.final('utf8');

// 結果を出力
console.log("復号化された値 -- " + decryptedValue1);

出力

C:\home\node>> node decipherFinal.js
Decrypted value -- Welcome to tutorials point

例2

続いて、もう1つの例を見てみましょう。この例では、update()とfinal()の結果をそれぞれ配列に格納してから結合して出力しています。

// decipher.final()メソッドの使用例

// cryptoモジュールのインポート
const crypto = require('crypto');

// AESアルゴリズムの初期化
const algorithm = 'aes-192-cbc';
// 鍵の生成に使用するパスワード
const password = '12345678123456789';

// decipherオブジェクト用の鍵を取得
const key = crypto.scryptSync(password, 'old data', 24);

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

const decipher = crypto.createDecipheriv(algorithm, key, iv);

// 復号化対象の暗号文
const encrypted =
'a05e87569f3f04234812ae997da5684944c32b8776fae676b4abe9074b31cd2a';

// 結果を格納する配列
var buf = [];

// update()メソッドでデータを復号化
let decrypted = decipher.update(encrypted, 'hex', 'utf8');

// 復号化したデータをバッファにプッシュ
buf.push(decrypted);
buf.push(decipher.final('utf8'));

// 結果を出力
console.log(buf.join(' '));

出力

C:\home\node>> node decipherFinal.js
Welcome to tutor ials point

例2の出力に余分なスペースが含まれているのは、update()とfinal()の結果をスペース区切りで結合(join(' '))しているためです。実際の開発では、例1のように文字列を直接連結するか、join('')を使ってスペースなしで結合するのがおすすめです。

まとめ

decipher.final()メソッドは、復号化処理の最後に必ず呼び出す必要がある重要なメソッドです。暗号化時に付与されたパディングの残りブロックを処理し、完全な平文を取得する役割を担います。一度呼び出すとそのdecipherオブジェクトは再利用できず、エラーが発生するため、新しいデータを復号化する場合は新しくdecipherオブジェクトを作成しましょう。

  1. Node.jsのprocess.argv0プロパティとは?使い方とprocess.argv[0]との違いを解説

    Node.jsでは、アプリケーション起動時に渡された元のargv[0]の値を、読み取り専用のコピーとして保持するための仕組みとしてprocess.argv0が用意されています。このプロパティを参照することで、Node.jsプロセスが起動された際の実行ファイル名を簡単に取得できます。 構文 process.argv0 パラメータ process.argv0は、保存されているargv[0]の読み取り専用コピーを返すだけのため、ユーザーからの入力(引数)は一切不要です。なお、これは関数ではなくプロパティである点に注意してください。括弧を付けて呼び出すのではなく、単純に参照するだけで値が取得できます。

  2. 【Node.js入門】process.argvでコマンドライン引数を取得する方法

    process.argv は、Node.js プロセスの起動時にコマンドラインから渡されたすべての引数を配列として返すプロパティです。配列の最初の要素には必ず process.execPath と同じ値(Node.js 実行バイナリへの絶対パス)が含まれ、2番目の要素には実行中のJavaScriptファイルのパスが格納されます。それ以降の要素には、ユーザーが指定した追加の引数が順番に並びます。 構文 process.argv パラメータ process.argv は、Node.js プロセス起動時に渡されたコマンドライン引数をすべて取得するためのものであり、ユーザーが何かを入力する必要はありま