OpenSSL 命令行 SM2 SM3操作
OpenSSL 生成 SM2 密钥
openssl ecparam -name SM2 -genkey -out sm2_ec.key
cat sm2_ec.key
-----BEGIN EC PARAMETERS-----
BggqgRzPVQGCLQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIB9dGHE5+6AD9DGmA8g/cEqn8HYTMBhbM+g2XJ16RqZ1oAoGCCqBHM9V
AYItoUQDQgAEJg19rra1BeuYx9ZU1GbfD0ceE9X67/c2hdb6XZLQor5oNVa+o9HZ
WBioc1hNCC2avO1Dpg5ZAb2YsS71TT7Bsw==
-----END EC PRIVATE KEY-----
OpenSSL 根据SM2私钥生成公钥
openssl ec -in sm2_ec.key -pubout -out sm2_ec.pubkey
read EC key
writing EC key
cat sm2_ec.pubkey
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEJg19rra1BeuYx9ZU1GbfD0ceE9X6
7/c2hdb6XZLQor5oNVa+o9HZWBioc1hNCC2avO1Dpg5ZAb2YsS71TT7Bsw==
-----END PUBLIC KEY-----
OpenSSL SM3 计算文件Hash
echo "https://const.net.cn" > sign.data
openssl dgst -SM3 sign.data
SM3(sign.data)= 8c13610aeb3040b2899ac224ae7db0710030803c424f776e7241340c66a6d553
OpenSSL 使用 SM2 签名文件
openssl dgst -SM3 -sign sm2_ec.key -out sm2_ec.sig sign.data
Error setting context
140524048778560:error:100C508A:elliptic curve routines:pkey_ec_ctrl:invalid digest type:../crypto/ec/ec_pmeth.c:331:
在当前版本(OpenSSL 1.1.1f)还不支持命令行使用SM2结合SM3签名。将hash算法换成sha256试试。
OpenSSL 使用 SM2 结合 sha256签名
openssl dgst -sha256 -sign sm2_ec.key -out sm2_ec.sig sign.data
root@hesy-ThinkPad-P15v-Gen-1:/home/hesy/2021/asn1/src/sm# hexdump -C sm2_ec.sig
00000000 30 46 02 21 00 d7 52 c2 63 a3 12 ff ef af 69 8e |0F.!..R.c.....i.|
00000010 8a 35 17 9f f2 0c e2 b1 80 fb dd a1 38 a3 59 14 |.5..........8.Y.|
00000020 5a 18 33 ba 43 02 21 00 9d 10 91 a7 5f a4 cf bb |Z.3.C.!....._...|
00000030 7b 75 c0 27 17 d5 2d 55 09 cc 10 49 29 f8 bc 0d |{u.'..-U...I)...|
00000040 10 d6 02 db b1 e4 7c 7a |......|z|
00000048
OpenSSL 使用 SM2 结合 sha256 验签
openssl dgst -sha256 -verify sm2_ec.pubkey -signature sm2_ec.sig sign.data
Verified OK
OpenSSL 使用 SM2 结合 SM3 验签
openssl dgst -SM3 -verify sm2_ec.pubkey -signature sm2_ec.sig sign.data
Error setting context
140471948707136:error:100C508A:elliptic curve routines:pkey_ec_ctrl:invalid digest type:../crypto/ec/ec_pmeth.c:331:
同上面一样的原因,官方没实现,命令行用不了。