Browserify `crypto.createDecipher` "Uncaught RangeError: Invalid array length"

Browserify `crypto.createDecipher` "Uncaught RangeError: Invalid array length"

我有一个在 Node 中工作的加密代码示例,但是当我在 browserify 中尝试它时,我得到一个 "Uncaught RangeError: Invalid array length"

var crypto = require("crypto");

function encrypt(data, key, algorithm, encoding) {
    algorithm = algorithm || "aes256";
    encoding = encoding || "base64";
    var cipher = crypto.createCipher(algorithm, key);
    return cipher.update(data, "utf8", encoding) + cipher.final(encoding);
}

function decrypt(data, key, algorithm, encoding) {
    algorithm = algorithm || "aes256";
    encoding = encoding || "base64";
    var decipher = crypto.createDecipher(algorithm, key);
    return decipher.update(data, encoding, "utf8") + decipher.final("utf8");
}

var key = "this is a very secure key";
var data = "The quick brown fox jumps over the lazy dog.";

var encryptedData = encrypt(data, key);
console.log("Encrypted: ", encryptedData);

var decryptedData = null;
try {
    decryptedData = decrypt(encryptedData, key);
    console.log("Decrypted: ", decryptedData);
} catch (ex) {
  console.log("Oops!", ex.stack);
}

if (data === decryptedData) {
  console.log("It worked!");
} else {
  console.log("Something went terribly wrong, my friend.");
}

来自节点的输出:

$ node crypto.js
Encrypted:  ClvTr5IWbgLHmgGQi81T6xtCR1RX4j5prSvFmtFr9+EXr5qKePKWcnu4tdFckh50
Decrypted:  The quick brown fox jumps over the lazy dog.
It worked!

Browserify 的输出:

Encrypted:  ClvTr5IWbgLHmgGQi81T6xtCR1RX4j5prSvFmtFr9+E=F6+ainjylnJ7uLXRXJIedA==
Oops! RangeError: Invalid array length

一些有趣的观察:

  1. Fr9+E 之后的加密输出不同(大约 43 个字符)让我认为问题出在加密而不是解密。
  2. 如果我为 data 选择一个较小的字符串,例如 "testing"。

完整代码在RequireBin。如果您能为我指出解决此问题的正确方向,我们将不胜感激。

更新

如果我在调用 decrypt(即解密 Node 的加密数据)之前添加以下代码行,它就可以工作。证明我的观点,错误出在加密器上。

encryptedData = "ClvTr5IWbgLHmgGQi81T6xtCR1RX4j5prSvFmtFr9+EXr5qKePKWcnu4tdFckh50";

更新 2

将算法设置为 aes-256-ctr 将使我的测试通过 Browserify,但我仍然担心 browserify-crypto 的 aes256 会产生与 Node 不同的结果。

已修复!

事实证明,这是 Browserify 对数据的 base64 编码的问题。它被 Browserify 的优秀人员合并到 master 中(参见 https://github.com/crypto-browserify/browserify-aes/pull/23)。