精华内容
下载资源
问答
  • sm2签名算法
    千次阅读
    2020-09-29 16:50:08
    public String sm2Sign(String text) throws SignatureException {
    		return Sm2Utils.createSM2Signature(text, smSignPrikey);
    	}
    //参数text代表需要签名的明文
    

    使用这个签名算法需要导入crypto-1.0-SNAPSHOT.jar
    使用这个工具类生成公私钥
    Win64OpenSSL-1_1_1g.msi
    如果需要jar包或者工具的或者需要SM2工具类可以私信我。免费提供。

    更多相关内容
  • 关于SM2签名算法的实现

    千次阅读 2020-02-29 11:50:06
    国密标准的SM2签名算法,并不是简单的将明文通过SM3算法Hash,再将Hash结果通过SM2算法使用私钥进行签名。 Hash这块比较复杂,要经过两次SM3算法进行Hash。 中间还有Za参与运算。 第一次Hash其实只是对Za的Hash,Za...

    使用SM2签名算法时发现采购的USBKEY竟然没有实现相关的SKF接口,无奈只能通过其他方式自己实现。

    查阅相关标准文档后发现,国密标准的SM2签名算法,并不是简单的将明文通过SM3算法Hash,再将Hash结果通过SM2算法使用私钥进行签名。

    Hash这块比较复杂,要经过两次SM3算法进行Hash。
    中间还有Za参与运算。

    在这里插入图片描述

    第一次Hash其实只是对Za的Hash,Za里面甚至包含了公钥信息(Xa,Ya),一些预定义的值(即曲线参数),详见附件A.2。得到Za的Hash结果后,与明文进行拼接,拼接之后的数据再进行一次Hash,将最后一次Hash的结果送入SM2算法进行签名。

    示例代码如下:

     unsigned char Pubkey[64]; 
     memcpy(Pubkey, ((char*)&(key_pv.XCoordinate)) + 32, 32); 
     memcpy(Pubkey + 32, ((char*)&(key_pv.YCoordinate)) + 32, 32); 
    
     unsigned char id[] = { 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38 }; 
     unsigned char a[] = { 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC }; 
     unsigned char b[] = { 0x28,0xE9,0xFA,0x9E,0x9D,0x9F,0x5E,0x34,0x4D,0x5A,0x9E,0x4B,0xCF,0x65,0x09,0xA7,0xF3,0x97,0x89,0xF5,0x15,0xAB,0x8F,0x92,0xDD,0xBC,0xBD,0x41,0x4D,0x94,0x0E,0x93 }; 
     unsigned char xg[] = { 0x32,0xC4,0xAE,0x2C,0x1F,0x19,0x81,0x19,0x5F,0x99,0x04,0x46,0x6A,0x39,0xC9,0x94,0x8F,0xE3,0x0B,0xBF,0xF2,0x66,0x0B,0xE1,0x71,0x5A,0x45,0x89,0x33,0x4C,0x74,0xC7 }; 
     unsigned char yg[] = { 0xBC,0x37,0x36,0xA2,0xF4,0xF6,0x77,0x9C,0x59,0xBD,0xCE,0xE3,0x6B,0x69,0x21,0x53,0xD0,0xA9,0x87,0x7C,0xC6,0x2A,0x47,0x40,0x02,0xDF,0x32,0xE5,0x21,0x39,0xF0,0xA0 }; 
     unsigned char sum[1024];   //这个就是Za 
     unsigned char predata[32];  //这个是Za Hash后的值
    
     memset(sum, 0, 1024); 
     memset(sum + 1, 128, 1); 
     memcpy(sum + 2, id, 16); 
     memcpy(sum + 2 + 16, a, 32); 
     memcpy(sum + 2 + 16 + 32, b, 32); 
     memcpy(sum + 2 + 16 + 32 + 32, xg, 32); 
     memcpy(sum + 2 + 16 + 32 + 32 + 32, yg, 32); 
     memcpy(sum + 2 + 16 + 32 + 32 + 32 + 32, Pubkey, 64); 
    
     rv = usb_key_Function_table.SKF_DigestInit_(hDev, SGB_SM3, NULL, NULL, 0, &hHash); 
     if (rv != SAR_OK) { 
      printf("first SKF_DigestInit error,rv=%x\n", rv); 
      usb_key_Function_table.SKF_CloseApplication_(hApplication); 
      usb_key_Function_table.SKF_DisConnectDev_(hDev); 
      return rv; 
     } 
    
     pulHashLen = sizeof(predata); 
     rv = usb_key_Function_table.SKF_Digest_(hHash, sum, 64 + 2 + 16 + 32 + 32 + 32 + 32, predata, &pulHashLen); 
     if (rv != SAR_OK) { 
      printf("first SKF_Digest_ error,rv=%x\n", rv); 
      usb_key_Function_table.SKF_CloseApplication_(hApplication); 
      usb_key_Function_table.SKF_DisConnectDev_(hDev); 
      return rv; 
     } 
    
     rv = usb_key_Function_table.SKF_DigestInit_(hDev, SGB_SM3, NULL, NULL, 0, &hHash); 
     if (rv != SAR_OK) { 
      printf("second SKF_DigestInit error,rv=%x\n", rv); 
      usb_key_Function_table.SKF_CloseApplication_(hApplication); 
      usb_key_Function_table.SKF_DisConnectDev_(hDev); 
      return rv; 
     } 
    
     rv = usb_key_Function_table.SKF_DigestUpdate_(hHash, predata, sizeof(predata)); 
     if (rv != SAR_OK) { 
      printf("second SKF_Digest_update error,rv=%x\n", rv); 
      usb_key_Function_table.SKF_CloseApplication_(hApplication); 
      usb_key_Function_table.SKF_DisConnectDev_(hDev); 
      return rv; 
     } 
    
     rv = usb_key_Function_table.SKF_DigestUpdate_(hHash, pbData, ulDataLen); 
     if (rv != SAR_OK) { 
      printf("second SKF_Digest_update error,rv=%x\n", rv); 
      usb_key_Function_table.SKF_CloseApplication_(hApplication); 
      usb_key_Function_table.SKF_DisConnectDev_(hDev); 
      return rv; 
     } 
    
     pulHashLen = sizeof(pbHashData); 
     rv = usb_key_Function_table.SKF_DigestFinal_(hHash, pbHashData, &pulHashLen); 
     if (rv != SAR_OK) { 
      printf("second SKF_Digest_final error,rv=%x\n", rv); 
      usb_key_Function_table.SKF_CloseApplication_(hApplication); 
      usb_key_Function_table.SKF_DisConnectDev_(hDev); 
      return rv; 
     } 
    
     rv = usb_key_Function_table.SKF_ECCSignData_(hContainer, pbHashData, pulHashLen, pSignature); 
     if (rv != SAR_OK) { 
      printf("SKF_ECCSignData error,rv=%x\n", rv); 
      usb_key_Function_table.SKF_CloseApplication_(hApplication); 
      usb_key_Function_table.SKF_DisConnectDev_(hDev); 
      return rv; 
     } 
    
     
    
    展开全文
  • SM2签名算法规范

    2019-04-14 13:49:30
    国密SM2椭圆曲线公钥密码算法规范中签名算法部分,有利于理解并使用
  • 1.SM2数字签名生成算法 假设待签名的消息为M,为了获取消息M的数字签名(r,s),作为签名者的用户A应实现以下运算步骤: (1)置M‾=ZA∣∣M\overline{M}=Z_A ||MM=ZA​∣∣M其中ZA是用户的A的可辨标识、部分椭圆...

    2021SC@SDUSC

    数字签名

    1. 参数与密钥产生

    参数的产生、密钥的产生与SM2加密解密算法相同。

    2. 数字签名生成验证过程

    1.SM2数字签名生成算法

    假设待签名的消息为M,为了获取消息M的数字签名(r,s),作为签名者的用户A应实现以下运算步骤:
    (1)置 M ‾ = Z A ∣ ∣ M \overline{M}=Z_A ||M M=ZAM其中ZA是用户的A的可辨标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;

    (2)计算, e = H v ( M ‾ ) e=H_v (\overline{M}) e=Hv(M)并将生成e的数据类型转换成整数型;

    (3)使用随机数发生器产生随机数 k ∈ [ 1 , n − 1 ] k∈[1,n-1] k[1,n1]

    (4)计算椭圆曲线点 ( x 1 , y 1 ) = [ k ] G (x_1,y_1)=[k]G (x1,y1)=[k]G,其中G是椭圆曲线上的基点, ( x 1 , y 1 ) (x_1,y_1 ) (x1,y1)在椭圆曲线上;
    (5)计算 r = ( x 1 + e ) m o d n r=(x_1+e)modn r=(x1+e)modn,若r = 0或者r + k = n,就返回到步骤(3)重新生成随机数;

    (6)计算 s = ( ( 1 + d A ) − 1 ⋅ ( k − r d A ) ) m o d n s=((1+d_A)^{-1}⋅(k-rd_A))modn s=((1+dA)1(krdA))modn,若计算的s值为0,则返回步骤(3)重新生成随机数;

    (7)将得到的(r, s)数据类型转换成字节串,则消息M的签名值为(r, s)。
    3.SM2 数字签名验证算法

    为了检验收到的消息M ‘以及其数字签名(r’,s’),作为验证者的用户B进行以下步骤:

    (1)检验r’∈[1,n-1]是否成立,若不成立则验证不通过;

    (2)检验s’∈[1,n-1]是否成立,若不成立则验证不通过;

    (3)置 M ′ ‾ = Z A ∣ ∣ M ′ \overline{M^′}=Z_A ||M^′ M=ZAM,其中Z_A是关于用户的A的可辨标识,部分椭圆曲线系统参数和用户A公钥的杂凑值;

    (4)计算 e ′ = H v ( M ′ ‾ ) e^′=H_v (\overline{M ^′} ) e=Hv(M),将e’的数据结构类型转换成整数;
    (5)将接收到的数字签名值(r’,s’ )的数据类型转换成整数,计算t=(r’+s’)modn,若t=0则验证不通过;

    (6)计算椭圆曲线点 ( x 1 ′ , y 1 ′ ) = [ s ′ ] G + [ t ] P A (x_1^′,y_1^′ )=[s^′ ]G+[t]P_A (x1,y1)=[s]G+[t]PA

    (7)将椭圆曲线点的坐标 x 1 ′ x_1^′ x1的数据类型转换成整数,计算 R = ( e ′ + x 1 ′ ) m o d n R=(e^′+x_1^′)modn R=(e+x1)modn ,检验R=r’是否成立,若不成立则验证不通过;否则验证通过。

    展开全文
  • 国密(2)-- SM2签名和加密算法介绍

    千次阅读 2022-05-05 15:54:20
    最详细的SM2签名验签和加解密的介绍;

    下面通过国密 GMTLS的密钥协商过程来介绍SM2签名和加密算法:

    1 客户端发送client hello消息,携带client random,random(Unix time+random bytes = 总 32字节)

    2 服务端响应Serverhello消息,携带Server random,random(Unix time+random bytes = 总 32字节)

    3 服务端响应 Certifcation 证书,国密目前采用双证书,第一个证书是签名证书,里面携带公钥;第二个证书是加密证书,里面携带公钥。

    4 服务端响应Server Key exchange,携带内容为签名后的数据,真正有用内容为64字节(512bit),采用SM2的签名算法。

    签名后数据(signed data 64bytes,黄色部分,其他为ASN.1  DER编码的部分)的格式;

    0c000048

    0046

    3044

    0220   

    167df66d32adea948746f0794c383d2460a99e31d5f0c13faa28e4bdec98bdb9

    0220

    64e6294caf543717f73eda8d7a6b05cc6c570233fa7b381d20aab114ad9ea43b

    签名之前的原始数据有四部分组成:

    client random(32字节)+Server random(32字节)+ 加密证书的长度(3字节)+加密证书内容

    对以上四个部分串联起来运行SM2签名算法就可以得到签名后的数据。下面是签名前的数据:

    B20653C9B35996333D8079CF401FE28791704502700584C4C6A0F04894597DE1 client random(32字节
    D76E6BC156B1BA2A5CEA6C251B6C2038E00CBD8194132BC33452E22E0F324F2D Server random(32字节
    000204  加密证书的长度(3字节)
    30820200308201A3A00302010202060172A83ECF43300C06082A811CCF550183750500304B310B300906035504061302434E310E300C060355040A1305474D53534C3110300E060355040B1307504B492F534D32311A3018060355040313114D6964646C65434120666F7220546573743022180F32303135313233313136303030305A180F32303335313233303136303030305A3048310B300906035504061302434E310E300C060355040A1305474D53534C3110300E060355040B1307504B492F534D32311730150603550403130E64656D6F312E676D73736C2E636E3059301306072A8648CE3D020106082A811CCF5501822D03420004DE8AC0D2D5916E178C9CEF0292944090572FF44EA19421FB50199881071419C10D7B5C0510448CD6CAADC67344182D14992F96701FE1C232B84B2C5065884464A370306E301B0603551D23041430128010F97F55B427943362A656CA6FCC5D1AFF30190603551D1104123010820E64656D6F312E676D73736C2E636E30190603551D0E041204101FE8221B5C7A4594CEF4B288722A10E330090603551D1304023000300E0603551D0F0101FF040403020038300C06082A811CCF5501837505000349003046022100B5EE4B3756F901C9F4849104171DD551F17601A6A88C14803DF2C2EA7FEDFE380221008A69ED842C6C424D8D5AFCB8CDC47E8E803160AF7BA70348394EB1D54372A0FB  (加密证书内容)

    以上数据可以使用下面在线SM2工具验证,输入(公钥+签名后数据+待签名数据)数据,点击公钥验签即可。这个工具做的非常棒,记得给这个工具的作者点赞

     SM2加解密

    5 客户端收到server key exchange后,验证签名后的数据是OK的话,可以发送client key exchange给服务端;client key exchange里面携带了premaster key的信息,此信息采用SM2的加密算法,因此client key exchange携带的是SM2加密后的数据;

    SM2加密后数据的格式如下:

    SM2加密后的预主密钥premaster key
    0220
    2cdd8654bd7ee4bb0bc88c31cd4e782757e24cb84871f4c3967a728f43deb69c    X1    C1
    022100
    95dfac5ccc9e335b7afae3ca82e8deecd4887583bb1d4d4a924cad94ce1ef592     Y1    C1
    0420
    3f8343b12e3e4f23e72c5248a51e5e018ccbea99a7621cfd6771641bd60f3381    Hash   C3

    0430
    19728b03239b4f22872fa9ebf90ee7954c0a257b60fb7060f5910abe56d04ba71a5ef33e8afd409392f6fcdebc3582e9   Random(48字节)  C2

    可以采用SM2的解密工具算出加密前的premaster key:

    在下面的工具内输入加密证书对应的私钥,再输入上面加密后的数据内容(绿色部分),点击私钥解密即可。

    SM2加解密

    上面解密出的Pre-master key的内容如下,共48字节:

    0101 2个字节,代表国密版本号:0101

    E582AAC5064CF164DCAC7A14BFEC7BF30AF646558DC7DC63CBC77265EDE6E7721D2161FA098EF3EC41FECBFEF107 46字节pre-master key

    Master Key的计算公式如下:

    master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random)[0..47];

    就不详细展开介绍了。

    展开全文
  • SM2 签名算法秘钥在线生成

    千次阅读 2022-03-13 09:15:04
    SM2 密钥在线生成工具 (const.net.cn) Web Encrypt
  • 国密SM2数字签名算法

    万次阅读 2017-03-01 23:50:13
    SM2是基于椭圆曲线的数字签名算法,关于椭圆曲线的解释可以常见前一篇关于椭圆曲线的微博,下面概要的介绍一下SM2签名的过程。
  • sm2国密算法加解密,签名、验签QT工具的源代码(包含sm2,sm3和sm4源码)。 环境我使用的QT5.14的IDE编译,其他版本qt未测试。不过仅使用了几个简单控件应该关系不大。 详细介绍参见个人博客:SM2 (含SM3、SM4)国密...
  • Digest Encryption algorithmIdentifier类型标明一个签名算法,本规范为SM2密码算法,其OI见 GM/T OOO Digest EncryptionAlgorithmIdentifier AlgorithmIdentifier 6.5 ExtendedcertificateorCertificate ...
  • 【转】C#sm2签名验签实现

    千次阅读 热门讨论 2022-06-09 18:12:56
    【转】C#sm2签名验签实现
  • SM2签名方案的安全性

    2022-06-24 20:38:33
    证明SM2签名方案是 EFU-CMA 安全的,且可以抵抗密钥替换(KS)攻击
  • 国密SM2验签算法浅谈(二)

    千次阅读 2021-09-29 16:09:51
    二、SM2签名验签机制 SM2曲线方程,其中六个参量都是固定的。根据国密局给出的规范定义如下: 方程为: y2 = x3 + ax + by p=FFFFFFFE FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF; a=FFFF...
  • 6.5SM2数字签名算法 在政府高度重视和市场迫切需求的双向驱动下,国密算法SM1—SM9应时而生。其中,SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,包含5个部分: 总则 数字签名算法 密钥交换...
  • 国密算法sm实现 sm2数字签名 密钥交换,sm3,sm4,已实现、求sm2第四部分公钥加密c实现源码。。。江湖救急。。。
  • SM2签名入参填写“SM2Sign”、SM4解密入参填写“SM4DecryptECB”、SM4加密入参填写“SM4EncryptECB”. 2)参数二sM2Prikey:SM2私钥 3)参数三sM4Key:SM4密钥 4)参数四sInput:当smType=SM2Sign,则sInput入参...
  • SM2椭圆曲线公钥密码算法第2部分:数字签名算法GM0003.2-2012 SM2椭圆曲线公钥密码算法第3部分:密钥交换协议GM0003.3-2012 SM2椭圆曲线公钥密码算法第4部分:公钥加密算法GM0003.4-2012 SM2椭圆曲线公钥密码算法第5...
  • 签名过程(私钥签名) 1)签名数据 = 填充||数据,并计算e = SM3(填充||数据)。不完全是SM3运算,还有其他处理过程; 2)产生随机数k,1≤k≤阶-1,并计算点kG = (x1,y1); 3)计算r = (e + x1); 4)计算s = (k-rm)/...
  • sm2数字签名算法python实现
  • 详解国密SM2的数字签名

    千次阅读 2021-01-27 15:42:59
    详解国密SM2的数字签名 数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理...
  • 国密SM2签名算法一次签名中做多少次点乘运算。国密SM2签名算法一次签名中做多少次点乘运算。国密SM2签名算法一次签名中做多少次点乘运算。
  • 8.5基于SM2签名算法的环签名 首先,我们来回顾一下SM2签名算法 曲线参数 SM2标准推荐使用256位素域Fp上的椭圆曲线y2=x3+ax+b,其中: 密钥生成算法 签名算法 验证算法 接收到的...
  • 国密算法SM2签名、SM2验证签名示例(二);SM2模式与ASN1区别在于签名值长度不一样。
  • SM2算法学习

    2022-03-15 18:50:58
    SM2非对称加密算法先从ECC算法开始。 Elliptic Curve Cryptography 椭圆曲线满足函数:y2=x3+ax+b (4a3+27b2 ≠\neq​= 0) , 限定条件保证曲线不包含奇点。 椭圆曲线算法的基本要求:1)给定私钥k和椭圆曲线基点G...
  • SM2签名的预处理过程

    2020-11-15 11:01:23
    SM2签名及验证过程中,并不是直接计算被签名数据的摘要,而是要经过专门的预处理过程得到摘要。此过程包含两个阶段的摘要计算: 1)Z = SM3(ENTL || ID || a || b || x_G || y_G || x_A || y_A) ENTL || ID || a || ...
  • 最近在工作中遇到一个需求:签名者使用...在 CSDN 上找到了 goldboar 写的 SM2 签名及验签函数(http://download.csdn.net/detail/goldboar/3833072),但是不能直接使用。原因如下:1) goldboar 的程序是自己生成 S...
  • 国密算法SM2签名、SM2验证签名示例(一)ASN1模式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,580
精华内容 1,032
关键字:

sm2签名算法