從網上找了很多,都沒有寫的特別清楚的,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數字簽名方案中被簽名的雜湊值不僅僅是消息的雜湊值,而是簽名者身份信息串聯上消息的雜湊值,其中簽名者身份信息是簽名者的可辨別標識字串、橢圓曲線方程系數、生成元和簽名者公鑰串聯后字串的雜湊值。