首页 > 其他分享 >国密 SM2 的非对称签名验签过程

国密 SM2 的非对称签名验签过程

时间:2024-04-12 22:33:20浏览次数:24  
标签:BigInteger 私钥 userID SM2 国密 签名 验签 非对称

国密 SM2 的非对称签名验签过程

介绍

非对称加密确保了消息传输中的保密性,但是由于使用公钥加密,而公钥是分发出去的,可能泄露,谁都可以使用公钥加密发送消息。
因此为了保证收到的消息是由对应的发送者发出的,就需要用到非对称签名和验签逻辑,发送者通过自己的私钥进行对消息进行签名,
接收方通过公钥对消息进行验证签名。非对称签名还确保了消息在传输过程中未被篡改,还有不可否认性,因为理论上只有发送者才有私钥

椭圆曲线

椭圆曲线和公钥,私钥,和 SM2 的非对称加密解密是一致的,这里再重复提一下。

椭圆曲线是由一组方程描述的点的集合:

y2 = x3 + ax + b 其中 a, b 满足 (4a3 + 27b2 ≠ 0)

SM2 定义了一个 sm2p256v1 的椭圆曲线方程

各种参数

BigInteger p = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF");
BigInteger a = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC");
BigInteger b = FromHex("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93");
BigInteger n = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123");
BigInteger h = BigInteger.One;

Point G coord: (22963146547237050559479531362550074578802567295341616970375194840604139615431, 85132369209828568825618990617112496413088388631904505083283536607588877201568)

公钥,私钥

  • 私钥:

可以随机生成一个 BigInteger d,必须符合区间 [1, n - 1]

  • 公钥:

私钥 d * G(Point) 得到的一个 Point: Q

签名过程

私钥: d
userID: SM2 提供了一个默认的 userId "1234567812345678" 字符串的 byte 数组,可以修改

签名过程主要是为了得到 BigInteger r 和 BigInteger s

摘要过程

  • d * G 生成 公钥点 Q
  • 对 (userID.Length) * 8 >> 8, userID.Length, userID, 方程参数 A, B, 基点G(x,y), 公钥点 Q(x,y), 算出摘要 z
  • 对 z, 原文 算出摘要 eHash: byte[32]
  • 将 eHash 转成 BigInteger e

生成签名

  1. 随机生成一个 BigInteger k
  2. k * G 生成一个 Point(x, y) P
  3. BigInteger r = e + P.x
  4. BigInteger s = (k - r * d) / (d + 1)

发送方将 r,s 编码随着消息发送

验签过程

验签使用公钥点 Q 进行验签 对签名发过来的 BigInteger r, BigInteger s 进行验证

摘要过程

  • 对 (userID.Length) * 8 >> 8, userID.Length, userID, 方程参数 A, B, 基点G(x,y), 公钥点 Q(x,y), 算出摘要 z
  • 对 z, 原文 算出摘要 eHash: byte[32]
  • 将 eHash 转成 BigInteger e
  • 验证等式是否成立: r = e + (s * G + (r + s) * Q).x

证明过程:

已知条件

P = k * G

r = e + P.x

s = (k - r * d) / (d + 1)

公私钥关系 d * G = Q

e + (s * G + (r + s) * Q).x = e + P.x

s * G + (r + s) * Q = P

即要证明 s * G + r * Q + s * Q = k * G

s * G + s * Q + r * Q - k * G

∵ Q = d * G

= s * G + s * d * G + r * d * G - k * G

= (1 + d) * s * G + r * d * G - k * G

∵ s = (k - r * d) / (d + 1)

= (k - r * d) * G + r * d * G - k * G

= k * G - r * d * G + r * d * G - k * G

= k * G - k * G

= 0

总结

  1. 计算过程中省略了对求同余的计算
  2. 加密保证消息传输的保密,加签保证消息是由特定发送者发出,以及消息未被篡改
  3. SM2 算法中,签名过程使用私钥运算生成两个大数 (r, s) 验证过程则使用公钥来确认签名是否有效, 消息是否被篡改
  4. 有的机构在会约定不同的 userID

标签:BigInteger,私钥,userID,SM2,国密,签名,验签,非对称
From: https://www.cnblogs.com/huiyuanai709/p/18132266/sm2_sign_verify

相关文章

  • 使用OpenEuler x86_64 实现Bouncycastle SM2加解密
    使用OpenEulerx86_64实现BouncycastleSM2加解密一、安装运行环境安装java和mavensudoyuminstalljava-17-openjdksudoyuminstallmaven安装完成后,你就可以在OpenEuler上使用Maven来管理Java项目了。二、创建项目工程在项目根目录下创建pom.xml文件用......
  • 商密测评必知:国密算法的重要性与应用
    国密算法是指由中国国家密码管理局发布的密码算法标准,旨在保障国家信息安全。目前,国家密码管理局已发布了一系列国产商用密码标准算法,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9以及祖冲之密码算法(ZUC)等。通过在金融、电子政务及安防等领域广泛应用国密算法,在对敏感数据进行机密性......
  • 利用openssl生成SM2公私钥对
      openssl1.1.1+版本增加了对SM2的支持,所以我们就能直接使用这些版本的opsnssl生成SM2的公私钥对。首先我们得在Linux或者Windows服务器中安装对应版本的openssl库,具体过程略。软件包请到官网下载:https://www.openssl.org/安装完成后,使用下列命令查看该版本的op......
  • [实战]API防护破解之签名验签
    前言:传统的接口在传输的过程中,是非常容易被抓包进行篡改,从而进行中间人攻击。这时候我们可以通过对参数进行签名验证,如果参数与签名值不匹配,则请求不通过,直接返回错误信息,从而防止黑客攻击或者大大增加了黑客攻击的成本。白帽子在挖洞的时候也经常会遇到这种情况,大多数不会逆向......
  • nginx国密ssl测试
    文章目录文件准备编译部署nginx申请国密数字证书配置证书并测试文件准备下载文件并上传到服务器,这里使用centos7.8本文涉及的程序文件已打包可以直接下载。点击下载下载国密版opensslhttps://www.gmssl.cn/gmssl/index.jsp下载稳定版nginxhttp://nginx.org/en/download.html......
  • 【HMS Core】应用内支付成功后,返回结果验签失败
    ​【问题描述】应用内支付成功后,返回结果验签失败 【解决方案】验签失败可以从以下几点进行逐一排查1.签名算法是否匹配(可以通过获取getSignatureAlgorithm来验证目前使用的签名算法)​2.签名公钥是否正确​确保公钥获取正确,签名算法如果打开了SHA256WithRSA/PSS,则建议......
  • 利用GmSSL制作SM2国密证书
    Part0前言     GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法、SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准......
  • Java SM2 工具类,依赖bcprov-jdk15on
    老版本bcprov-jdk15on和新版本的有点不一样,新版本的签名后需要DER格式和r|s格式转换,可以和老版本一样<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>import......
  • QT使用OpenSSL的接口实现RSA2的签名和验签
    QT使用OpenSSL的接口实现RSA2的签名和验签加密和签名在RSA加密算法中是两个不同的概念,虽然它们都涉及RSA密钥对的使用,但目的和应用场景有所不同。加密(encrypt/decrypt):加密:使用接收方的公钥对数据进行加密,只有拥有相应私钥的接收方才能解密数据。解密:使用接收方的私钥对......
  • 关于“公钥加密私钥解密,私钥加签公钥验签”的一些理解
    看了网上的很多资料,发现有些点没有说到,也比较复杂,这里根据个人的理解,简单描述,方便记忆。 先理解公/私钥(yue)的意思:私钥,即 私人 的钥匙,是唯一的,所以可以用来证明来源是特定的人公钥,即 公用 的钥匙,我可以将它给很多人(公众)。所以既然那么多人都知道,所以公钥并不能证明来源......