当前位置:   article > 正文

CryptoJS对密文AES解密失败_js的aes解不开

js的aes解不开

情况Postman 使用 CryptoJS 对数据 AES解密后AES在线工具 解密不一致。

原因:数据中 "\n\r" 在 postman 中有不同含义,比如: "\r" 在windows"回车",在mac"换行"

方案:待解密数据 "\n\r"替换成 "",已保证数据连续不被 "\n\r" 切割

  1. // 用UTF-8进行编码的字符串(按需进行处理,例如按Base64对密钥进行加密等)
  2. var key = CryptoJS.enc.Utf8.parse(dataSecret);
  3. var iv = CryptoJS.enc.Utf8.parse(dataSecretIv);
  4. // 自定义数据内容
  5. var data = {
  6. "appId":appId,
  7. "appKey": appKey
  8. };
  9. // 对数据进行AES加密
  10. var encryptData = CryptoJS.AES.encrypt(JSON.stringify(data), key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString();
  11. // 对数据进行AES解密(注意JS或Postman中,返回的结果如果含有换行符,先处理再解密)
  12. var decryptStr = encryptData.toString().replace(/\r\n/g,"").replace(/\n/g,"");
  13. var decryptData = CryptoJS.AES.decrypt(response.data, key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);
  14. // 均上为伪码,注意使用。备注: PCKS7和5其实是一样的。

完整示例:

  1. // 自定义数据
  2. var data = {
  3. "outOrderId": "202003061634082266",
  4. "driverId": "5757857",
  5. "stubId": "1412729998476976128",
  6. "gunId": "1",
  7. "org": "TS",
  8. "time": 1457689012,
  9. "preFrozenAmount": 30.00
  10. };
  11. // 重写Date的format函数
  12. Date.prototype.Format = function (fmt) { // author: meizz
  13. var o = {
  14. "M+": this.getMonth() + 1, // 月份
  15. "d+": this.getDate(), // 日
  16. "h+": this.getHours(), // 小时
  17. "m+": this.getMinutes(), // 分
  18. "s+": this.getSeconds(), // 秒
  19. "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
  20. "S": this.getMilliseconds() // 毫秒
  21. };
  22. if (/(y+)/.test(fmt))
  23. fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  24. for (var k in o)
  25. if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  26. return fmt;
  27. }
  28. // 基于时间+4位随机数
  29. var outOrderId = new Date().Format("yyyyMMddhhmmss") + Math.round(Math.random()*9999);
  30. pm.environment.set("outOrderId", outOrderId);
  31. data.outOrderId = outOrderId;
  32. // 获取Postman环境变量
  33. var appSecret =pm.environment.get("appSecret");
  34. var dataSecret = pm.environment.get("dataSecret");
  35. var dataSecretIv = pm.environment.get("dataSecretIv");
  36. var timeStamp = pm.environment.get("timeStamp");
  37. var key = CryptoJS.enc.Utf8.parse(dataSecret);
  38. var iv = CryptoJS.enc.Utf8.parse(dataSecretIv);
  39. // 数据加密(AES + HmacMD5 )
  40. var encryptData = CryptoJS.AES.encrypt(JSON.stringify(data), key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString()
  41. var sign = encryptData + timeStamp;
  42. sign = CryptoJS.HmacMD5(sign, appSecret);
  43. pm.environment.set("data", encryptData);
  44. pm.environment.set("sign", sign.toString().toUpperCase());

  1. // 获取Postman的环境变量
  2. var appId = pm.environment.get("appId");
  3. var appKey =pm.environment.get("appKey");
  4. var appSecret =pm.environment.get("appSecret");
  5. var dataSecret = pm.environment.get("dataSecret");
  6. var dataSecretIv = pm.environment.get("dataSecretIv");
  7. // 按需处理,UTF-8 -> 密钥和矢量
  8. var key = CryptoJS.enc.Utf8.parse(dataSecret);
  9. var iv = CryptoJS.enc.Utf8.parse(dataSecretIv);
  10. // ------------------------------------------
  11. pm.test("Status code is 200", function () {
  12. pm.response.to.have.status(200);
  13. });
  14. var response = JSON.parse(responseBody);
  15. if(response.code === 100){
  16. var decryptStr = response.data.toString().replace(/\r\n/g,"").replace(/\n/g,"");
  17. var decryptData = CryptoJS.AES.decrypt(decryptStr, key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);
  18. console.log(decryptData);
  19. postman.setEnvironmentVariable("orderId",JSON.parse(decryptData).orderId);
  20. return;
  21. }
  22. console.log(response);

tip:喜欢的小伙伴收藏和关注哟~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/873094
推荐阅读
相关标签
  

闽ICP备14008679号