开发者社区 问答 正文

nodejs 解密小程序用户手机号,编码错误

nodejs 解密小程序用户手机号,编码错误 这是我的代码



var CryptoJS = require("crypto-js");
// 用户在支付宝小程序授权手机号后的 response
var data = "M7FoAhJ2EsP39HVwmIFDYOWgOYFL1TS9WA1jMIybU+PI0htDNwqvs1hXP5wKVwj9lMlTaD/Go2xfPVan61NuH8nrvb2kcqO5df4kP4he/6XOaVx4rmIAVwRfTn+K+7y5KTp+UH+bapt8et0ZbIcRcbjPsB2Xxof+01KYbehLBYNEQSSsmILSOJIYpWG8qzRFfleolrqgNed616iJsxc7+Mx6Au26i3PXxcBuKTp+5Ue81rJGyL5NkdB5MxbN2WCiaJAJrZhnfHsBaGXcVX97hpFnKxvSboJ75zeP8N0B6n9d1AbVGhw3+fcxWNCpBpynNBsNCZHJ2KOyYtn9gGOt0A=="

// 支付宝小程序设置的 AES
var aes = 'Lj59Ubk1ZyzlUZGTKgTl6A==';
// Base64  Utf8
var res =  Buffer.from(data,'base64').toString();

var aes1 =  Buffer.from(aes,'base64').toString();

var bytes  = CryptoJS.AES.decrypt(res, aes1);

var plaintext = bytes.toString(CryptoJS.enc.Utf8);
console.log(plaintext,'plaintext');

请问哪里不对呢?

展开
收起
游客wgnsjfqc76we4 2019-12-23 17:43:42 1350 分享
分享
版权
来自: 支付宝开发者社区 举报
阿里云 AI 助理回答

从你提供的代码来看,问题可能出在几个地方:

  1. Base64解码后直接使用: 通常AES解密需要处理的是原始的字节数据,而不是解码后的字符串。Node.js中Buffer.from(data, 'base64')会给你原始的字节数据,但之后你又用toString()将其转换为字符串,这一步可能是多余的,因为CryptoJS的decrypt方法期望的是CipherParams或密文的字节流。

  2. 秘钥处理方式: 同样地,你将AES秘钥也进行了Base64解码并转为字符串。对于CryptoJS来说,如果你的秘钥是Base64编码的,直接使用Base64字符串作为秘钥即可,不需要先解码成字符串。

  3. 秘钥和向量(IV): AES加密时通常会用到一个初始化向量(IV),特别是CBC模式下。如果加密时使用了IV,解密时也需要提供相同的IV。但从你的代码中没有看到处理IV的部分,如果小程序端加密时确实使用了IV,你需要确保在解密时也正确提供。

修正后的代码示例(假设未使用IV,且直接处理字节数据):

var CryptoJS = require("crypto-js");

// 用户在支付宝小程序授权手机号后的 response
var dataBase64 = "M7FoAhJ2EsP39HVwmIFDYOWgOYFL1TS9WA1jMIybU PI0htDNwqvs1hXP5wKVwj9lMlTaD/Go2xfPVan61NuH8nrvb2kcqO5df4kP4he/6XOaVx4rmIAVwRfTn K 7y5KTp UH bapt8et0ZbIcRcbjPsB2Xxof 01KYbehLBYNEQSSsmILSOJIYpWG8qzRFfleolrqgNed616iJsxc7 Mx6Au26i3PXxcBuKTp 5Ue81rJGyL5NkdB5MxbN2WCiaJAJrZhnfHsBaGXcVX97hpFnKxvSboJ75zeP8N0B6n9d1AbVGhw3 fcxWNCpBpynNBsNCZHJ2KOyYtn9gGOt0A==";

// 支付宝小程序设置的 AES 密钥(保持为Base64字符串)
var aesBase64 = 'Lj59Ubk1ZyzlUZGTKgTl6A==';

// 将Base64编码的数据转换为WordArray格式,CryptoJS内部使用的数据结构
var ciphertext = CryptoJS.enc.Base64.parse(dataBase64);

// 将Base64编码的密钥转换为WordArray格式
var key = CryptoJS.enc.Base64.parse(aesBase64);

// 假设没有IV,直接进行解密
try {
    var bytes  = CryptoJS.AES.decrypt({ciphertext: ciphertext}, key);
    var plaintext = bytes.toString(CryptoJS.enc.Utf8);
    console.log(plaintext, 'plaintext');
} catch (err) {
    console.error('Decryption error:', err);
}

请确认是否在加密时使用了IV,如果有的话,解密时也要相应地提供IV参数。此外,检查是否有其他潜在的编码问题或密钥不匹配的情况。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等