1

node.js crypto のドキュメントは、パディングが入力ストリームに自動的に挿入されることを示しています。平文の SHA1 ハッシュを計算し、その 20 バイトのハッシュを PKCS5 パディングで AES-256/CBC を使用して暗号化する必要がある単純なテスト プログラムがあります。ここに私のテストコードがあります:

var fs = require('fs');
var crypto = require('crypto');

var key = [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
            0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f ];

var iv = [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
           0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f ];

var test_string = "This is the string I am signing";

// Create SHA1 hash of our string
var sha1Hash = crypto.createHash("sha1");
sha1Hash.update(test_string, "utf8");
var sha1 = sha1Hash.digest();

var aesCipher =
        crypto.createCipheriv("aes-256-cbc", (new Buffer(key)), (new Buffer(iv)));
aesCipher.update(sha1, "binary");
var encrypted = aesCipher.final("binary");

fs.writeFile('data/node_encrypted.bin', encrypted, function (error) {
    if (error)
        throw error;
    console.log("File saved!");
});

ただし、これにより生成されるファイルの長さはわずか 23 バイトです。適切な PKCS5 パディングがあれば、出力は 32 バイトになると予想していました。私は何が欠けていますか?

4

1 に答える 1

4

1 つには、 の戻り値を無視することで、暗号化されたコンテンツの最初の部分を破棄していますaesCipher.update()。また、update()出力エンコーディングを指定していないため、バッファをfinal()返していますが、「バイナリ」文字列を返しています。代わりに試してみてください:

var encrypted = Buffer.concat([
  aesCipher.update(sha1, "binary"),
  aesCipher.final()
]);
于 2014-05-28T15:34:20.880 に答える