开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 444|回复: 8
收起左侧

[完成] 求助 JS 大佬,SM2 JS 解密求助

 关闭 [复制链接]
结帖率:82% (9/11)
发表于 2024-7-5 13:33:57 | 显示全部楼层 |阅读模式   广东省东莞市
50精币
一个网站的登录JS SM2加密, 和论坛的 这个贴子算法是一致 https://bbs.125.la/forum.php?mod ... ;highlight=sm2%2BJS
加密已经套用这个测试成功了,但是想实现解密,搜了一圈百度,那些在线解密的,都没办法成功解密,所以来请教有研究过的大佬,有没有用用易语言解密成功的
公钥是 04+传统公钥形式
加密后的密文,也是04+密文组合
-----------------------------------------------------
测试私钥:009f3903dc2a248a9c1411fd24aa40c091b857ee054a21ee39b753130a114a9239
测试密文:04b10f3cd550807bae165e1857f8f8ec78b23685594a5187bbd37dc9f825caaf2daed09ca2fa6a3542698dea0ee307fa17e9effdbeb119ba828df307b62540ee324c72c491be3f4b159abc927935a9c0b95c217e1cfd44696e4e45bbb4ca6ae45483237d0f8cfbc4ab17

解密后结果应该为:123456***

论坛上那个测试成功加密的易语言源码放到下面链接里了:https://bayisoft.lanzoub.com/iocld23ksvwh

最佳答案

查看完整内容

要不就是私钥不对,要不就是你给的密文不对,我用你给的源码都没解密成功
结帖率:100% (5/5)

签到天数: 21 天

发表于 2024-7-5 13:33:58 | 显示全部楼层   浙江省金华市
要不就是私钥不对,要不就是你给的密文不对,我用你给的源码都没解密成功 qqq.png
回复

使用道具 举报

结帖率:82% (9/11)

签到天数: 21 天

 楼主| 发表于 2024-7-5 14:31:24 | 显示全部楼层   广东省东莞市
解密部分JS代码:
function doDecrypt(encryptData, privateKey, cipherMode = 1, {
  output = 'string',
} = {}) {
  privateKey = new BigInteger(privateKey, 16)

  let c3 = encryptData.substr(128, 64)
  let c2 = encryptData.substr(128 + 64)

  if (cipherMode === C1C2C3) {
    c3 = encryptData.substr(encryptData.length - 64)
    c2 = encryptData.substr(128, encryptData.length - 128 - 64)
  }

  const msg = _.hexToArray(c2)
  const c1 = _.getGlobalCurve().decodePointHex('04' + encryptData.substr(0, 128))

  const p = c1.multiply(privateKey)
  const x2 = _.hexToArray(_.leftPad(p.getX().toBigInteger().toRadix(16), 64))
  const y2 = _.hexToArray(_.leftPad(p.getY().toBigInteger().toRadix(16), 64))

  let ct = 1
  let offset = 0
  let t = [] // 256 位
  const z = [].concat(x2, y2)
  const nextT = () => {
    // (1) Hai = hash(z || ct)
    // (2) ct++
    t = sm3([...z, ct >> 24 & 0x00ff, ct >> 16 & 0x00ff, ct >> 8 & 0x00ff, ct & 0x00ff])
    ct++
    offset = 0
  }
  nextT() // 先生成 Ha1

  for (let i = 0, len = msg.length; i < len; i++) {
    // t = Ha1 || Ha2 || Ha3 || Ha4
    if (offset === t.length) nextT()

    // c2 = msg ^ t
    msg[i] ^= t[offset++] & 0xff
  }

  // c3 = hash(x2 || msg || y2)
  const checkC3 = _.arrayToHex(sm3([].concat(x2, msg, y2)))

  if (checkC3 === c3.toLowerCase()) {
    return output === 'array' ? msg : _.arrayToUtf8(msg)
  } else {
    return output === 'array' ? [] : ''
  }
}
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 3 天

发表于 2024-7-5 14:32:14 | 显示全部楼层   浙江省杭州市
我搞过,看我名字…
回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 19 天

发表于 2024-7-5 14:43:27 | 显示全部楼层   湖南省娄底市
非对称加密 私钥才能解密哦

OpenSSL3.0实现国密SM2(非对称加解密/签名)SM3散列SM4对称加解密
https://bbs.125.la/forum.php?mod=viewthread&tid=14730086
(出处: 精易论坛)
回复

使用道具 举报

结帖率:82% (9/11)

签到天数: 21 天

 楼主| 发表于 2024-7-5 14:45:16 | 显示全部楼层   广东省东莞市
揰掵佲 发表于 2024-7-5 14:43
非对称加密 私钥才能解密哦

OpenSSL3.0实现国密SM2(非对称加解密/签名)SM3散列SM4对称加解密

这个没用,早看过了,加密的就不对,更别说解密了。
回复

使用道具 举报

结帖率:82% (9/11)

签到天数: 21 天

 楼主| 发表于 2024-7-5 16:55:14 | 显示全部楼层   广东省东莞市
by029 发表于 2024-7-5 16:27
要不就是私钥不对,要不就是你给的密文不对,我用你给的源码都没解密成功 ...

私钥是在webpack里取的,应该是对的。密文是用webpack里的公钥算出来的,测试也是可以登录成功的。你看下解密时,是不是要把前面的04去掉
回复

使用道具 举报

结帖率:82% (9/11)

签到天数: 21 天

 楼主| 发表于 2024-7-5 17:02:48 | 显示全部楼层   广东省东莞市
wuyueqi168 发表于 2024-7-5 16:55
私钥是在webpack里取的,应该是对的。密文是用webpack里的公钥算出来的,测试也是可以登录成功的。你看下 ...

sm2.js 里 包含了公钥私钥,格式如下,公钥我删除了
------------------------------------------------------------------------
var _smCrypto = __webpack_require__(/*! sm-crypto */ "./node_modules/sm-crypto/src/index.js");
var pwdKey = "***"; //公钥
var PRIVATEKEY = "009f3903dc2a248a9c1411fd24aa40c091b857ee054a21ee39b753130a114a9239";
function sm2Encrypt(msgString) {
  var msg = msgString;
  if (typeof msgString !== "string") {
    msg = JSON.stringify(msgString);
  }
  // console.log(msg,'加密前')
  // 1 - C1C3C2;        0 - C1C2C3;        默认为1
  var cipherMode = 1;
  var publicKey = pwdKey;
  // 加密结果
  var encryptData = _smCrypto.sm2.doEncrypt(msg, publicKey, cipherMode);
  //Base64编码 自行选择是否使用
  //let baseEncode = Base64.encode(encryptData)
  // 加密后的密文前需要添加04,后端才能正常解密 (不添加04,后端处理也可以)
  var encrypt = "04" + encryptData;
  return encrypt;
}

// 解密
function doDecryptStr(enStr) {
  var msg = enStr;
  if (typeof enStr !== "string") {
    msg = JSON.stringify(enStr);
  }
  // 1 - C1C3C2;        0 - C1C2C3;  默认为1
  var cipherMode = 1;
  var privateKey = PRIVATEKEY;
  var enval = enStr.substring(2);
  // 解密结果
  var doDecrypt = _smCrypto.sm2.doDecrypt(enval, privateKey, cipherMode);
  // 解密后类型转换
  // let objData = JSON.parse(doDecrypt);
  return doDecrypt;
回复

使用道具 举报

结帖率:82% (9/11)

签到天数: 21 天

 楼主| 发表于 2024-7-5 23:46:11 | 显示全部楼层   广东省东莞市
by029 发表于 2024-7-5 16:27
要不就是私钥不对,要不就是你给的密文不对,我用你给的源码都没解密成功 ...


经测试 确实应该是私钥不对。
这个网址可以在线解密,https://config.net.cn/tools/SM2.html。用这个网站生成的秘钥对,用论坛的那个加密源码加密后,可以用网站上的解密完成。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表