你好,根据nodejs官网api文档:When using an authenticated encryption mode (GCM
, CCM
and OCB
are currently supported), the cipher.getAuthTag()
method returns a Buffer
containing the authentication tag that has been computed from the given data.采用gcm模式加密的数据,解密时需要一个身份验证数据, 这个身份验证是加密的时候生成, 但是微信没有提供这个身份验证, 只有associated_data, key, nonce和加密数据, 是否无法解密?
老哥解决了吗。。
加密使用的AEAD_AES_256_GCM,tag被附加到密文后了。参考rfc5116上写的
所以,你有两种选择
自己手动分离ciphertext和authTag,然后按文档setAuthtag(),再final()
好像设置setAutoPadding(true)可以
没有用过Node.js,只能帮到这里了
谢谢
意思是 AES-256 的auth tag是最后32位吗?截取就行?
// https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/zheng-shu-he-hui-tiao-bao-wen-jie-mi // 对 API V3 加密数据进行解密 const apiV3Key = '*******'; // 设置的 API V3 密钥 const decryptByApiV3 = ({ associate, // 加密参数 - 类型 nonce, // 加密参数 - 随机数 ciphertext, // 加密密文 } = {}) => { ciphertext = decodeURIComponent(ciphertext); ciphertext = Buffer.from(ciphertext, 'base64'); const authTag = ciphertext.slice(ciphertext.length - 16); const data = ciphertext.slice(0, ciphertext.length - 16); const decipher = crypto.createDecipheriv('aes-256-gcm', apiV3Key, nonce); decipher.setAuthTag(authTag); decipher.setAAD(Buffer.from(associate)); let decryptedText = decipher.update(data, null, 'utf8'); decryptedText += decipher.final(); return decryptedText; };
微信“加密后的证书内容”解密算法:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_11nodejs官方文档:https://nodejs.org/docs/latest-v11.x/api/crypto.html#crypto_cipher_getauthtag