从网上找了很多,都没有写的特别清楚的,gmssl官网还有小bug,特此写如下文档供参考:
运行环境:安装了Gmssl环境的Linux(详见上一篇博客)
生成SM2私钥(需要输入密码,最少4位)
$ gmssl sm2 -genkey -sms4 -out sm2.pem
将SM2私钥整数值转换为PEM格式的私钥
$ gmssl sm2 -inform text -out sm2.pem
导出SM2公钥
$ gmssl sm2 -in sm2.pem -pubout -out sm2Pub.pem
显示SM2私钥的Z值
$ gmssl sm2 -genzid -in sm2.pem -id 1234567812345678 -noout
计算带Z值的杂凑值
$ gmssl sm2utl -dgst -in msg.txt -pubin -inkey sm2Pub.pem -id 1234567812345678
对消息签名
$ gmssl sm2utl -sign -in msg.txt -inkey sm2.pem -id 1234567812345678 -out sig.der
$ gmssl sm2utl -verify -in msg.txt -sigfile sig.der -pubin -inkey sm2Pub.pem -id 1234567812345678
注意,sm2utl是对消息签名,因此支持输入为任意长的消息。pkeyutl也可以进行SM2签名,但是输入是消息的杂凑值
加密解密
$ gmssl sm2utl -encrypt -in msg.txt -pubin -inkey sm2Pub.pem -out enced.der
$ gmssl sm2utl -decrypt -in enced.der -inkey sm2.pem
和pkeyutl交互
$ gmssl sm2utl -dgst -in msg.txt -pubin -inkey sm2Pub.pem -id 1234567812345678 -out msg.sm3 $ gmssl sm2utl -sign -in msg.txt -inkey sm2.pem -id 1234567812345678 -out sm2.sig
$ gmssl pkeyutl -verify -pkeyopt ec_scheme:sm2 -in msg.sm3 -sigfile sm2.sig -pubin -inkey sm2Pub.pem $ gmssl pkeyutl -sign -pkeyopt ec_scheme:sm2 -in msg.sm3 -inkey sm2.pem -out sm2.sig $ gmssl sm2utl -verify -in msg.txt -sigfile sm2.sig -pubin -inkey sm2Pub.pem -id 1234567812345678
$ gmssl sm2utl -encrypt -in msg.txt -pubin -inkey sm2Pub.pem -out enced.der $ gmssl pkeyutl -decrypt -pkeyopt ec_scheme:sm2 -pkeyopt ec_encrypt_param:sm3 -in enced.der -inkey sm2.pem $ gmssl pkeyutl -encrypt -pkeyopt ec_scheme:sm2 -pkeyopt ec_encrypt_param:sm3 -in msg.txt -pubin -inkey sm2Pub.pem -out enced.der $ gmssl sm2utl -decrypt -in enced.der -inkey sm2.pem
SM2数字签名
SM2数字签名方案中被签名的杂凑值不仅仅是消息的杂凑值,而是签名者身份信息串联上消息的杂凑值,其中签名者身份信息是签名者的可辨别标识字串、椭圆曲线方程系数、生成元和签名者公钥串联后字串的杂凑值。