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
相关产品推荐
相关产品推荐

