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

C#与Node.js的Rijndael加密结果不一致问题排查

C#与Node.js Rijndael加密结果不匹配的解决方法

将C#中的Rijndael加密逻辑迁移到Node.js时,即使使用相同的密钥、IV、CBC模式、128位块大小和PKCS7填充,加密"1234"的结果仍不一致:

  • C#输出:6d9SB6t9dktDJ+siSlFtOQ==
  • Node.js(使用rijndael-js库)输出:6ewzPyaxUgFX8IXW9iLJfw==

问题原因

  • 库实现兼容问题:rijndael-js库的Rijndael实现与C#中RijndaelManaged(当块大小为128位时等价于标准AES-256-CBC)存在差异,导致加密结果不匹配。
  • C#中配置的Rijndael(块大小128位、密钥长度256位)本质就是标准AES-256-CBC,Node.js原生crypto模块提供了符合规范的AES实现,可与C#逻辑完全对齐。

修正后的Node.js代码

使用Node.js原生crypto模块替代rijndael-js,代码如下:

const crypto = require('crypto');

// 与C#完全一致的密钥和IV
const key = Buffer.from([
    63, 115,  38, 206,  45, 102, 229,  13,
    161, 196, 250, 133, 149,  70, 153,  33,
    218,  32, 135, 149, 150,  21, 143,  11,
    210, 115, 185, 163,  24,  70, 145, 141
]);
const iv = Buffer.from([
    151, 121, 168, 83, 221, 99, 206, 230,
    74, 190, 106, 212, 232, 117, 192, 37
]);

// 明文转UTF-8字节(与C# StreamWriter默认编码一致)
const plaintext = Buffer.from('1234', 'utf8');

// 创建AES-256-CBC加密器,默认使用PKCS7填充
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
// 执行加密并拼接最终结果
let encrypted = cipher.update(plaintext);
encrypted = Buffer.concat([encrypted, cipher.final()]);

// 输出与C#完全一致的Base64结果
console.log(encrypted.toString('base64')); // 6d9SB6t9dktDJ+siSlFtOQ==

关键对齐点

  • 编码一致:C#的StreamWriter默认使用无BOM的UTF-8编码,Node.js中通过Buffer.from('1234', 'utf8')保证编码匹配。
  • 填充一致:crypto.createCipheriv默认采用PKCS7填充,与C#的PaddingMode.PKCS7完全对应。
  • 加密参数一致:aes-256-cbc明确指定了CBC模式、256位密钥、128位块大小,和C#的配置完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:17:12