标签 SM2 下的文章

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:

同上面一样的原因,官方没实现,命令行用不了。

《基于LTE的车联网无线通信技术 安全证书管理系统技术要求》 SM2 验证过程

已知数据
签名证书对应的SM2私钥:

17 9e 18 ae e3 38 72 e1 60 5e 99 e8 bc 61 20 f7 
95 e7 c8 f8 a9 ce 60 7a 4a 71 78 68 23 53 a1 69

签名证书SM3哈希值:

e3 8c 7c b2 ec ed b9 28 9b 6e 71 ad 30 b6 26 2c 
4a 57 85 73 b9 a4 4d e8 ab 65 9a 6b cd 96 7d 77

ToBeSignedData待签名数据值:

40 03 80 20 34 34 34 34 34 34 34 34 34 34 34 34 
34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 
34 34 34 34 40 01 20 00 00 00 00 00 23 73 03 

过程数据
签名证书对应的公钥:

X:
1e 5f 89 a5 74 08 2c 8b 36 11 fb a8 d0 65 f3 08 
b4 8f 64 ee ef 71 30 3c 75 ba 8e 95 d5 be 89 42 
Y:
77 84 ef 22 09 41 de eb cf 5b 3e 34 65 98 0a 30 
91 67 34 6f fe 05 0a e1 00 7c 2d 2f 3f 10 57 74

ZA值:

ff 25 43 65 9c 0b 93 c3 9f e3 b4 00 73 98 df 9f 
b4 0c f4 5d e3 65 e7 c9 af 16 5d 42 68 35 0b b9 

Hash (ZA || Data input) 值:

7a b1 2a 19 b6 45 df c6 36 e2 0e a7 ae b0 e5 5e 
f3 f3 68 38 87 b2 e0 76 a8 eb 32 94 90 4e e5 d4

签名结果数据

R:
DD F9 07 5D D2 D9 47 05 A1 2F 42 5E 51 CB 27 4C 
B8 F4 AE 65 B3 1C 7C DD CD 31 C2 BC 3C 55 28 81
S:
20 86 11 DE 09 A7 CC 4E 48 76 E6 9E F2 E7 C0 6A 
85 39 A4 67 F2 0B 0E A7 FE EB 2A FE 9D 59 5C C4

附录
ZA值计算方法
SM2是一种椭圆曲线密码学算法, SM2只与单个特定的256位椭圆曲线相关联,因此在本标准中与SM2相关联的标识符不需要额外的曲线指示。
本标准中SM2的签名格式r用整数表示。SM2通过将身份字符串添加到要散列的消息前来命名散列函数, 这个身份字符串是:
𝑍𝐴 = 𝐻ASH(𝐸𝑁𝑇𝐿𝐴||𝐼𝐷𝐴||𝑎||𝑏||𝑥𝐺| |𝑦𝐺 ||𝑥𝐴||𝑦𝐴)
其中

1) ENTLA 是由IDA长度转换而成的两个字节字符,值为IDA的有效比特数;
2) IDA 是发送方的ID;
3) a 和b是SM2椭圆曲线的方程参数;
4) xG和yG 是SM2基点的 x和y坐标;
5) xA和yA是验签公钥的x和y坐标;

数字签名用H(ZA || Data input)计算,而不是只用M计算,此处的Data input为待签名的消息数据。
本标准约定IDA为发送方正在使用证书的32字节哈希值,也即IDA=HashedId32(Certificate)并按GB/T 32918进行比特串到字节串的转换,ENTLA 是0x0100。当签发的证书为自签名证书时,IDA为16进制整数31323334353637383132333435363738,并按GB/T 32918进行整数到字节串的转换,因此ENTLA 是0x0080。