node.jsでAES暗号化と圧縮解凍がうまくいかない
やりたいことは、
圧縮 → AES暗号 → 相手に渡す → AES復号 → 解凍
です。
下記のコードを実行すると最後の行で「incorrect header check」エラーが発生します。
zlib.deflateSyncの戻り値とzlib.inflateSync()に渡しているdecに既に相違があるので当然と言えば当然ですが、AES暗号化をからめるとどう記述して良いのかわかりません。
詳しい方がいましたらよろしくお願いします。
ちなみに、圧縮関係なく、AES暗号化復号化自体はロジックが正しいことは確認しています。その逆に暗号化関係なく、ただの圧縮解凍は正しく動くことを確認しています。二つを組み合わせるとフォーマット(型?)の関係でうまくいきません。
(typescriptなのでvarではなくletを使用しています)
let password = 'password';
let m = cryptor.createHash('sha256');
m.update(password);
let crypto_key_hash = m.digest('binary');
// ZLIB圧縮.
let data = 'this is request ticket.';
data = zlib.deflateSync(data);
// AES暗号化.
let cipher = cryptor.createCipheriv('aes-256-cbc', crypto_key_hash, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f");
let encData = cipher.update(data, 'binary', 'base64');
encData += cipher.final('base64');
// HTTP通信で相手に渡す...
// AES復号化.
let decipher = cryptor.createDecipheriv('aes-256-cbc', crypto_key_hash, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f");
let dec = decipher.update(encData, 'base64', 'binary');
dec += decipher.final('binary');
dec = new Buffer(dec);
// ZLIB解凍.
dec = zlib.inflateSync(dec);
追記:
deflateSyncの戻り値とbinaryというエンコーディングが合っていないのが問題だとは気づいています。
Bufferクラスを使って一度BASE64化して復号化時のアウトプットもBASE64にすると成功しました。
let password = 'password';
let m = cryptor.createHash('sha256');
m.update(password);
let crypto_key_hash = m.digest('binary');
// ZLIB圧縮.
let data = 'this is request ticket.';
data = zlib.deflateSync(data);
data = new Buffer(data).toString('base64');
// AES暗号化.
let cipher = cryptor.createCipheriv('aes-256-cbc', crypto_key_hash, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f");
let encData = cipher.update(data, 'base64', 'base64');
encData += cipher.final('base64');
// HTTP通信で相手に渡す...
// AES復号化.
let decipher = cryptor.createDecipheriv('aes-256-cbc', crypto_key_hash, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f");
let dec = decipher.update(encData, 'base64', 'base64');
dec += decipher.final('base64');
dec = new Buffer(dec, 'base64');
// ZLIB解凍.
dec = zlib.inflateSync(dec);
dec = new Buffer(dec).toString('utf8');
しかし、効率悪いことをやっているように思えます。
フォーマット関連で改善の方法はありますでしょうか?