

やりたいことは、

圧縮 → AES暗号 → 相手に渡す → AES復号 → 解凍

です。

下記のコードを実行すると最後の行で「incorrect header check」エラーが発生します。

zlib.deflateSyncの戻り値とzlib.inflateSync()に渡しているdecに既に相違があるので当然と言えば当然ですが、AES暗号化をからめるとどう記述して良いのかわかりません。  
詳しい方がいましたらよろしくお願いします。

ちなみに、圧縮関係なく、AES暗号化復号化自体はロジックが正しいことは確認しています。その逆に暗号化関係なく、ただの圧縮解凍は正しく動くことを確認しています。二つを組み合わせるとフォーマット(型？)の関係でうまくいきません。

(typescriptなのでvarではなくletを使用しています)

[code]

    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);
    
[/code]

追記：  
deflateSyncの戻り値とbinaryというエンコーディングが合っていないのが問題だとは気づいています。  
Bufferクラスを使って一度BASE64化して復号化時のアウトプットもBASE64にすると成功しました。

[code]

    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');
    
[/code]

しかし、効率悪いことをやっているように思えます。  
フォーマット関連で改善の方法はありますでしょうか？


CC BY-SA 3.0
2016-08-17T04:07:44.057
28326
2016-08-17T05:31:13.510
2016-08-17T04:51:10.823
14288
14288
question
node.js
node.jsでAES暗号化と圧縮解凍がうまくいかない


自己解決しました。  
cipher.updateが直接Bufferを扱えることを知ったので以下のように記述しました。

[code]

    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, '', 'hex');
    encData += cipher.final('hex');
    
    // 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, 'hex');
    dec = Buffer.concat([dec, decipher.final()]);
    
    // ZLIB解凍.
    dec = zlib.inflateSync(dec).toString('utf8');
    
[/code]


CC BY-SA 3.0
2016-08-17T05:31:13.510
28328
2016-08-17T05:31:13.510
14288
28326
answer