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
一些有趣的观察:
Fr9+E
之后的加密输出不同(大约 43 个字符)让我认为问题出在加密而不是解密。
- 如果我为
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)。
我有一个在 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
一些有趣的观察:
Fr9+E
之后的加密输出不同(大约 43 个字符)让我认为问题出在加密而不是解密。- 如果我为
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)。