问题是这样的,小弟现在在做的是公众号对接工行的支付,其中有个数据加密的环节。我这个加密过去工行那边一直报解密失败。工行的加密要求为:API开放平台具体AES算法为AES/CBC/PKCS5Padding 针对AES算法 IV(initialization vector),即初始化向量长度为16字节(128位).初始化为0,加密后BASE64输出,解密向量与初始化向量是相同的。 下面是我个人构造的加密: aesCipher(data) { //const iv = new Buffer([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); //const iv = Buffer.alloc(16, 0) let aeskey = ‘LjKqH69sLlqGe+pPSqgWUQ==‘ const iv = "0000000000000000" console.log(iv.length) var clearEncoding = ‘utf8’; var cipherEncoding = ‘base64’; var cipherChunks = []; var cipher = crypto.createCipheriv(‘aes-192-cbc’, aeskey, iv); cipher.setAutoPadding(true); cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding)); cipherChunks.push(cipher.final(cipherEncoding)); return cipherChunks.join(’’); }
想请大神来帮帮看看,这是我哪一步有问题。跪求啊,已经卡了好几天了。()
你自己解密看看正确不。
@waitingsong 我自己解密时可以的
试试 aes-128-cbc 呢?一般 Java 代码过来都是 128.更建议的办法是把 Java 代码拿过来自己本地测试 。
实在不行就 require(‘java’) 我这边项目需求最后实在解决不了就直接引入 jar 包
@mapleincode 老哥我也觉得奇怪,在代码里面用aes-128-cbc会报key长度不对。因为这个的确是192位的,我在网上找在线的用aes-192-cbc就不行。用aes-128-cbc才行。
@mapleincode 比较尴尬的就是,我不懂java。不太了解,之前都是做前端的。
@SKandAV 我仔细看了下你的代码。你的 aesKey 的确是 16 位的。你出错的原因是你没有对 aesKey 转换成 Buffer。以至于以 “hex” 的方式传入。所以变成了 aes-192 。实际上用 aes-128-cbc 可以正常测试通过。
@mapleincode 感觉一样啊老哥,我现在转成了Buffer,还是报的这个问题用aes-128-cbc的话。目前我感觉是我的初始化向量的问题,java端的初始化向量是这样构造的用node的话没有byte类型。目前在查怎么构造。因为我之前的向量是16个0 的字符串。应该是不太对的。
@SKandAV aesKey = Buffer.from(aesKey, ‘base64’);
你这个 key 的编码是 base64,你得加上类型
@SKandAV 顺便说下 new Buffer() 和 Buffer.from 其实效果一样。只是 new Buffer() 现在认为这个操作不安全,推荐 Buffer.from
const crypto = require(‘crypto’);
function aesCipher(data) { let aeskey = Buffer.from(‘LjKqH69sLlqGe+pPSqgWUQ==’, ‘base64’); const iv = Buffer.from(‘0000000000000000’); var clearEncoding = ‘utf8’; var cipherEncoding = ‘base64’; var cipherChunks = []; var cipher = crypto.createCipheriv(‘aes-128-cbc’, aeskey, iv); cipher.setAutoPadding(true); cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding)); cipherChunks.push(cipher.final(cipherEncoding)); return cipherChunks.join(’’); }
aesCipher(‘Hello node’);
const iv = Buffer.from(‘0000000000000000’) 结果是30哟
<Buffer 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30>
@mapleincode 太谢谢老哥,终于通过了。谢谢老哥,我根本没想到这个,老哥怎么一下就看出来是key的问题,谢谢老哥
@waitingsong 嗯,用的Buffer.alloc(16)了,已经成功了。谢谢老哥
@mapleincode 目前 new Buffer() 已废弃状态。应该用 Buffer 的静态方法来初始化。