赞
踩
下面通过国密 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工具验证,输入(公钥+签名后数据+待签名数据)数据,点击公钥验签即可。这个工具做的非常棒,记得给这个工具的作者点赞。
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:
在下面的工具内输入加密证书对应的私钥,再输入上面加密后的数据内容(绿色部分),点击私钥解密即可。
上面解密出的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];
就不详细展开介绍了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。