You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Rijndael加密结果与Java/C#不一致求助

Node.js中Rijndael加密与Java/C#结果不一致的解决方案

问题分析

你的Node.js加密结果和Java、C#不一致,核心原因有两个:

  • 填充方式不匹配:Java和C#代码使用了PKCS#7(等价于PKCS#5)填充,而rijndael-js默认不自动处理填充,需要手动添加。
  • 字符串转字节编码:需确保JS中将字符串转为UTF-8字节数组,和Java/C#的默认行为一致。

修复后的Node.js代码

const toHexString = (bytes) => {
  return Array.from(bytes, (byte) => {
    return ('0' + (byte & 0xff).toString(16)).slice(-2);
  }).join('');
};

const hexToBytes = (hex) => {
  var bytes = [];
  for (var c = 0; c < hex.length; c += 2) {
    bytes.push(parseInt(hex.substr(c, 2), 16));
  }
  return bytes;
};

// 手动添加PKCS#7填充
const pkcs7Pad = (data, blockSize) => {
  const padLength = blockSize - (data.length % blockSize);
  const pad = Buffer.alloc(padLength, padLength);
  return Buffer.concat([data, pad]);
};

const stringToEncrypt = 'test';
const keyAsHex = '12341234123412341234123412341234';
const ivAsHex = '43214321432143214321432143214321';

const keyAsBytes = hexToBytes(keyAsHex);
const ivAsBytes = hexToBytes(ivAsHex);
// 将字符串转为UTF-8字节数组
const plaintextBytes = Buffer.from(stringToEncrypt, 'utf8');
// 添加PKCS#7填充(块大小128位即16字节)
const paddedBytes = pkcs7Pad(plaintextBytes, 16);

const Rijndael = require('rijndael-js');
const cipher = new Rijndael(keyAsBytes, 'cbc');
// 传入填充后的字节数组,指定块大小128
const cipherAsBytes = cipher.encrypt(paddedBytes, 128, ivAsBytes);

console.log("cipherAsHex", toHexString(cipherAsBytes)); // 输出: 647768a8c969dc195e34c7968514494f

关键修改点说明

  • PKCS#7填充:实现pkcs7Pad函数,根据AES块大小(128位=16字节)计算填充长度,填充对应字节值(填充长度本身),和Java/C#的PKCS5Padding行为一致。
  • 字符串转字节:用Buffer.from(stringToEncrypt, 'utf8')明确将字符串转为UTF-8字节数组,和Java的message.getBytes()(默认UTF-8)、C#的StreamWriter(默认UTF-8)保持一致。
  • 加密输入:将填充后的字节数组传入encrypt方法,而非直接传字符串,避免库内部可能的编码差异。

内容的提问来源于stack exchange,提问作者jbd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:05:54