情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsで共通鍵暗号(AESなど)でデータを復号化する

使用可能な共通鍵暗号方式の取得

使用可能な共通鍵暗号方式を取得するにはcrypto.getCiphers関数を使用します。

var crypto = require('crypto');

var ciphers = crypto.getCiphers();

返り値として使用可能な共通鍵暗号方式が配列として得られます。

復号化

共通鍵暗号でデータを復号化するにはcrypto.createDecipheriv関数を使用します。

var decipher = crypto.createDecipheriv('xxx', buf1, buf2);

第1引数に暗号方式を指定します。たとえば、鍵長が256ビットのAESの場合にはaes256を指定します。

第2引数に共通鍵をバッファとして指定します。たとえば、鍵長が256ビットのAESの場合には32バイトの共通鍵を指定します。

第3引数に初期化ベクタ(initialization vector、IV)を指定します。たとえば、鍵長が256ビットのAESの場合には16バイトの初期化ベクタを指定します。

なお、第2引数の共通鍵や第3引数の初期化ベクタは何らかのデータ(パスワード)のPBKDF2とするべきです。データのPBKDF2を算出するにはcrypto.pbkdf2関数を使用します。

返り値としてデータを復号化する変換ストリームが得られます。

サンプルコード1

文字列を暗号化したものを復号化し、標準出力に出力します。

crypto-create-decipheriv.js

var crypto = require('crypto');

crypto.pbkdf2('password for key', 'salt for key', 10000, 32, 'sha256', function (err, key) {
    crypto.pbkdf2('password for iv', 'salt for iv', 10000, 16, 'sha256', function (err, iv) {
        var decipher = crypto.createDecipheriv('aes256', key, iv);
        decipher.on('error', function (err) {
            console.error(err);
            process.exit(1);
        });
        decipher.on('data', function (data) {
            console.log(data.toString('utf-8'));
        });
        decipher.write(Buffer.from([0xbe, 0x59, 0xb4, 0x94, 0x7c, 0xeb, 0x36, 0x2c, 0x68, 0x61, 0x35, 0x88, 0x4f, 0x06, 0x23, 0xb1]));
        decipher.end();
    });
});

実行結果

C:\work\node>node crypto-create-decipheriv.js
this is string.

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js