ECC证书验证方法

更新时间:2024-04-27 17:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

证书验证方法

这是一份完整的证书文件(.cer文件),采用asn1编码,其用16进制表示出来: 30 82 01 89 30 82 01 2f a0 03 02 01 02 02 10 11 98 f6 f3 d5 c2 26 aa 4b b2 71 12 ad 3d 4e 80 30 0a 06 08 2a 86 48 ce 3d 04 03 02 30 1d 31 1b 30 19 06 03 55 04 03 13 12 57 49 4e 2d 58 30 31 57 54 30 37 34 39 57 4d 2d 43 41 30 1e 17 0d 30 39 31 30 32 31 30 31 30 32 34 32 5a 17 0d 31 34 31 30 32 31 30 31 31 32 34 32 5a 30 1d 31 1b 30 19 06 03 55 04 03 13 12 57 49 4e 2d 58 30 31 57 54 30 37 34 39 57 4d 2d 43 41 30 59 30 13 06 07 2a 86 48 ce 3d 02 01 06 08 2a 86 48 ce 3d 03 01 07 03 42 00 04 f0 a3 20 f7 61 fd 5d ac e8 33 52 6c 25 db 72 7c 06 4d 95 00 0b 4b 88 37 25 fb 5a a7 ac 2c bd 1e e4 1d 0a f1 20 7f e6 04 12 e1 74 8e e3 72 bb ab 9a 2e af 5c 21 9a ef 0d ac b3 84 8c 40 39 b9 b0 a3 51 30 4f 30 0b 06 03 55 1d 0f 04 04 03 02 01 86 30 0f 06 03 55 1d 13 01 01 ff 04 05 30 03 01 01 ff 30 1d 06 03 55 1d 0e 04 16 04 14 e7 23 f5 b0 fd 38 4f 73 b7 b0 cc a6 6e 6f 7f 9a f1 77 aa d9 30 10 06 09 2b 06 01 04 01 82 37 15 01 04 03 02 01 00 30 0a 06 08 2a 86 48 ce 3d 04 03 02 03 48 00 30 45 02 21 00 fc fd f3 f5 a4 46 77 4b a5 7a 09 2c e0 ed 5f 99 ea ee 26 32 21 9f 5a 79 aa b4 13 ed 39 52 72 e0 02 20 10 86 2e 4b d6 53 95 a2 95 7e 9b bc 6e 17 d3 26 6c c2 d7 d2 28 d8 47 b3 c4 f2 af 5d cd 61 5a 6a

下面来解析这个文件,并说明如何进行证书验证,其实,不论是ECC证书,还是RSA证书,其证书格式都遵循x.509标准,所以同学们应该懂得这个标准。在RFC文档中有多篇x.509的文档,这里就不介绍了。

30 82 01 89 // 数据长度

// 被签名数据(TBSCertificate),简单记之为M: 30 82 01 2f a0 03 02 01 02 02 10 11

98 f6 f3 d5 c2 26 aa 4b b2 71 12 ad 3d 4e 80 30 0a 06 08 2a 86 48 ce 3d 04 03 02 30 1d 31 1b 30 19 06 03 55 04 03 13 12 57 49 4e 2d 58 30 31 57 54 30 37 34 39 57 4d 2d 43 41 30 1e 17 0d 30 39 31 30 32 31 30 31 30 32 34 32 5a 17 0d 31 34 31 30 32 31 30 31 31 32 34 32 5a 30 1d 31 1b 30 19 06 03 55 04 03 13 12 57 49 4e 2d 58 30 31 57 54

30 37 34 39 57 4d 2d 43 41 30 59 30 13 06 07 2a 86 48 ce 3d 02 01 06 08 2a 86 48 ce 3d 03 01 07 03 42 00 04 f0 a3 20 f7 61 fd 5d ac e8 33 52 6c 25 db 72 7c 06 4d 95 00 0b 4b 88 37 25 fb 5a a7 ac 2c bd 1e e4 1d 0a f1 20 7f e6 04 12 e1 74 8e e3 72 bb ab 9a 2e af 5c 21 9a ef 0d ac b3 84 8c 40 39 b9 b0 a3 51 30 4f 30 0b 06 03 55 1d 0f 04 04 03 02 01 86 30 0f 06 03 55 1d 13 01 01 ff 04 05 30 03 01 01 ff 30 1d 06 03 55 1d 0e 04 16 04 14 e7 23 f5 b0 fd 38 4f 73 b7 b0 cc a6 6e 6f 7f 9a f1 77 aa d9 30 10 06 09 2b 06 01 04 01 82 37 15 01 04 03 02 01 00

在被签名数据(TBSCertificate)内,含有公钥信息,其内容如下: 03 42 00 04 f0 a3 20 f7 61 fd 5d ac e8 33 52 6c 25 db 72 7c 06 4d 95 00 0b 4b 88 37 25 fb 5a a7 ac 2c bd 1e e4 1d 0a f1 20 7f e6 04 12 e1 74 8e e3 72 bb ab 9a 2e af 5c 21 9a ef 0d ac b3 84 8c 40 39 b9 b0

Ecc的公钥是曲线上的一个点Q=(Qx,Qy),该证书公钥是以非压缩的形式存储的(在公钥点的前面有一个04非压缩形式标志符号)。

Qx=f0a320f761fd5dace833526c25db727c064d95000b4b883725fb5aa7ac2cbd1e Qy=e41d0af1207fe60412e1748ee372bbab9a2eaf5c219aef0dacb3848c4039b9b0

紧接被签名数据M之后,就是签名算法:

............ 30 0a 06 08 2a 86 48 ce 3d 04 03 02

可见其算法OID=1.2.840.10045.4.3.2,网上可查得它所对应的实际算法以及密码系统参数,该算法为国际标准的ECC签名算法(ECDSA),摘要算法为hash256,椭圆曲线为secp256r1,参数如下: curve:

p=FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF a=FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC=-3. b=5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B // 基点G的压缩方式表达式:

G = 03 6B17D1F2 E12C4247 F8BCE6E5 63A440F2 77037D81 2DEB33A0 F4A13945 D898C296 //基点G的非压缩方式表达式(这与证书文件中显示的是一致的) G = 04 6B17D1F2 E12C4247 F8BCE6E5 63A440F2 77037D81 2DEB33A0 F4A13945 D898C296 4FE342E2 FE1A7F9B 8EE7EB4A 7C0F9E16 2BCE3357 6B315ECE CBB64068 37BF51F5 // 基点G的坐标表达式:

G=(Gx,Gy)

Gx=6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296 Gy=4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5 // 基点G的阶:

n =FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551 // cofactor: h = 01

顺便说一说:我国家标准的ECC签名算法OID是:1.2.156.10197.1.501

签名算法OID决定了签名算法以及曲线参数。

证书的最后部分是有关签名值的编码(起始位置位于证书文件倒数第5行,终点至文件尾): 03 48 00 30 45 02 21

00 fc fd f3 f5 a4 46 77 4b a5 7a 09 2c e0 ed 5f 99 ea ee 26 32 21 9f 5a 79 aa b4 13 ed 39 52 72 e0 02 20

10 86 2e 4b d6 53 95 a2 95 7e 9b bc 6e 17 d3 26 6c c2 d7 d2 28 d8 47 b3 c4 f2 af 5d cd 61 5a 6a 从中可以提得签名值

r=fcfdf3f5a446774ba57a092ce0ed5f99eaee2632219f5a79aab413ed395272e0 s=10862e4bd65395a2957e9bbc6e17d3266cc2d7d228d847b3c4f2af5dcd615a6a

OK,证书格式分析完了,下面开始签名验证了。 todo: // 验签过程

compute e=sh256(M). // e为256比特的大数。

=a254bf5975d3b78a3c286c6f1db2292919b12b080adbc9ab46ed8406e0fd0159 compute w=1/s mod n. compute u1=e*w mod n. compute u2=r*w mod n.

compute X=u1*G+u2*Q=(x1,x2)

注意: 这里的Q是CA证书(根证书)的公钥点,对于根证书或者自签证书,这里的Q就是前面证书文件中的Q点。

if X=O,then reject the signature.otherwise, compute v=x1 mod n.

iff v=r accept the signature.//结果表明该证书有效。

需要补充说明的是:这里介绍的是CA证书的验证,也就是说自签名证书(如根证书)的验证。如果是用户证书,那么如何验证其有效性呢?用户证书的验证与上面所讲的虽然不同,但是差别也不是很大。在用户证书中存储的公钥是用户自己的公钥,而不是根证书的公钥,而验证证书的有效性必须要用CA证书(或根证书)的公钥进行验证。也就是说,验签过程的公钥点Q必须采用根证书中的公钥点,而不能用用户证书中的公钥点。所以用户证书的验证还需要有根证书(或者根公钥)的参与才能进行。

本文来源:https://www.bwwdw.com/article/5jcg.html

Top