【问题标题】:Browserify `crypto.createDecipher` "Uncaught RangeError: Invalid array length"Browserify`crypto.createDecipher`“未捕获的 RangeError:无效的数组长度”
【发布时间】:2015-07-21 01:20:08
【问题描述】:

我有一个在 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 不同的结果。

【问题讨论】:

    标签: javascript cryptography browserify


    【解决方案1】:

    已修复!

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

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2020-01-31
      • 2019-08-19
      • 2016-12-18
      • 2018-12-28
      • 2021-10-05
      • 2017-07-28
      • 2016-12-19
      • 1970-01-01
      相关资源
      最近更新 更多