AES/CBC/PKCS5Padding 加密问题
发布于 4 个月前 作者 SKandAV 1360 次浏览 来自 问答

问题是这样的,小弟现在在做的是公众号对接工行的支付,其中有个数据加密的环节。我这个加密过去工行那边一直报解密失败。工行的加密要求为: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(’’); }

想请大神来帮帮看看,这是我哪一步有问题。跪求啊,已经卡了好几天了。()
15 回复

你自己解密看看正确不。

@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 1.png 感觉一样啊老哥,我现在转成了Buffer,还是报的这个问题用aes-128-cbc的话。目前我感觉是我的初始化向量的问题,java端的初始化向量是这样构造的2.png用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 的静态方法来初始化。

回到顶部