NodeJS 在节点js中使用加密模块时丢失部分加密文本

c7rzv4ha  于 2022-11-22  发布在  Node.js
关注(0)|答案(1)|浏览(156)

我尝试使用节点的内置加密模块对一些信息进行加密和解密。
它几乎工作,除了最后几个字符丢失。
例如,在下面的代码块中,我将“The quick brown fox jumps over the lazy dog”作为输入进行传递,但加密和解密后的最终输出是“The quick brown”,字符串的其余部分丢失。
我做错了什么?

let crypto = require("crypto");
let algorithm = "aes256";
let key = crypto.randomBytes(32);

const encrypt = (secret) => {
  let iv = crypto.randomBytes(16);
  let cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(secret);
  return {
    iv,
    encrypted,
  };
};

const decrypt = ({ iv, encrypted }) => {
  let decipher = crypto.createDecipheriv(algorithm, key, iv);
  let decrypted = decipher.update(encrypted);
  return decrypted.toString();
};

let text = "The quick brown fox jumps over the lazy dog";

let encrypted = encrypt(text);
let decrypted = decrypt(encrypted);

console.log(decrypted);

//Expected output: "The quick brown fox jumps over the lazy dog"

//Actual output: "The quick brown"
hyrbngr7

hyrbngr71#

You were missing cipher.final()

const fs = require("fs");
const https = require("https");
const url =
  "https://jsonbox.io/box_28a26747983acfdb501b/5d9dee93e6f3c60017ce16f5";

let crypto = require("crypto");
let algorithm = "aes256";
let key = crypto.randomBytes(32);

const encrypt = (secret) => {
  let iv = crypto.randomBytes(16);
  let cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(secret, "utf8", "hex");
  encrypted += cipher.final("hex");
  return {
    iv,
    encrypted
  };
};

const decrypt = ({ iv, encrypted }) => {
  let decipher = crypto.createDecipheriv(algorithm, key, iv);
  let decrypted = decipher.update(encrypted, "hex", "utf8");
  decrypted += decipher.final("utf8");
  return decrypted.toString();
};

let text = "The quick brown fox jumps over the lazy dog";

let encrypted = encrypt(text);
let decrypted = decrypt(encrypted);

console.log(decrypted);

中 的 每 一 个
Cipher.update 将 已 完全 填充 的 任何 缓冲 区 写入 变量 encrypted , 但 仍 有 一 个 剩余 的 块 仅 部分 填充 。 Cipher.final 允许 您 将 最 后 几 个 字节 添加 到 encrypted
cipher 这样 做 的 原因 是 为了 更 有效 地 加密 大量 的 数据 。 如果 你 正在 加密 一 个 大 文件 , 那么 你 可能 无法 在 内存 中 保存 整个 文件 。 因此 , 你 可以 向 cipher 中 添加 一些 文件 , 获取 任何 完全 完成 的 输出 , 将 该 输出 写入 输出 文件 , 然后 向 输入 文件 中 添加 更多 的 文件 , 依此 类推 。 本质 上 , 加密 是 在 块 中 完成 的 。并且 在 调用 cipher.final() 之前 , 内存 中 几乎 总是 有 下 一 个 块 的 一 部分 。

相关问题