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

将Go语言AES加密函数移植到Node.js的技术问题

移植三星SmartView AES加密函数到Node.js的解决方案

核心问题拆解与对应方案

  • 加密模式确认:原Go代码使用的是AES-ECB模式——它直接调用块加密器对每个数据块单独加密,没有使用CBC等需要初始向量(IV)的链式加密逻辑。你之前选择的aes-256-cbc是错误的,应改为aes-256-ecb(密钥长度由sessionKey决定:16字节对应AES-128,24字节对应AES-192,32字节对应AES-256)。
  • IV参数处理:ECB模式不需要IV,但Node.js的crypto.createCipheriv强制要求传入该参数,你可以传一个16字节的空Buffer(AES块固定大小),这个值会被自动忽略,示例:Buffer.alloc(16)。
  • 填充逻辑对齐:原Go代码手动实现了PKCS#7填充,而Node.js的crypto模块默认使用的就是PKCS#7填充,因此不需要手动处理填充逻辑,cipher.update和cipher.final会自动完成。
  • 废弃API替代:禁止使用已废弃的crypto.createCipher,必须使用crypto.createCipheriv,即使ECB模式也需遵循此规范。

修正后的Node.js代码

const crypto = require('crypto');
const SESSION_KEY = "59e8ca4b09f2a19ab5421cf55d604c7c";

// 注意:如果Go中的sessionKey是十六进制编码的字节数组,需改用Buffer.from(SESSION_KEY, 'hex')
const KEY_BUFFER = Buffer.from(SESSION_KEY);

function aesEncrypt(plaindata) {
    // 初始化ECB模式的加密器,IV传空Buffer即可
    const cipher = crypto.createCipheriv('aes-256-ecb', KEY_BUFFER, Buffer.alloc(16));
    
    // 兼容字符串或Buffer输入,输出原始密文字节(和Go函数返回格式一致)
    let encrypted = cipher.update(plaindata instanceof Buffer ? plaindata : Buffer.from(plaindata));
    encrypted = Buffer.concat([encrypted, cipher.final()]);
    
    // 如果后续需要base64格式输出,替换为:return encrypted.toString('base64')
    return encrypted;
}

额外注意事项

  • 密钥长度校验:AES密钥必须是16/24/32字节,需确保SESSION_KEY转成Buffer后的长度符合要求,否则加密会报错。
  • 输入输出格式:原Go函数接收和返回的都是字节数组,上述代码保持了一致的格式;如果你的业务场景需要base64字符串输出,只需修改返回语句即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:45:35