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

