10

I'm having weird issues with Node's crypto library. I wrote this simple AES testing script:

var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8')
var text = "123|123123123123123";
cipher.update(text,'utf8','hex')
var crypted = cipher.final('hex')
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8')
decipher.update(crypted,'hex','utf8')
var dec = decipher.final('utf8')

When I do console.log(dec), it's null. For some reason if I set test to "123|123123", it works. So why does "123|123123" work but "123|123123123123123" doesn't?

4

3 に答える 3

29

cipher.update と cipher.final からの戻り値を保存して、すべてが揃っていることを確認する必要があります。

cipher.update 「暗号化されたコンテンツを返し、ストリーミングされる新しいデータで何度も呼び出すことができます」:

http://nodejs.org/docs/v0.2.5/api.html#cipher-update-247

cipher.final 「残りの暗号化されたコンテンツを返します」。

次のように、呼び出しごとに結果を追加するだけだと思います。

var crypto = require('crypto');
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8');
var text = "123|123123123123123";
var crypted = cipher.update(text,'utf8','hex');
crypted += cipher.final('hex');
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8');
var dec = decipher.update(crypted,'hex','utf8');
dec += decipher.final('utf8');

上記のノードv0.2.5で、暗号化された場合は「12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585」、decの場合は「123 | 123123123123123」を取得します

于 2010-12-24T17:22:23.590 に答える
8

RandomEtc は正しいですが、この質問につまずいた人'base64'がエンコーディングとして使用している場合に備えて:しないでください。に固執し'hex'ます。少なくとも 0.4.2 の時点では、'base64'を使用するとデータが破損する可能性があるバグがあります。参照: https://github.com/joyent/node/issues/738/

于 2011-03-09T05:20:08.040 に答える