PBOC之国密验签流程

本文介绍了一种基于国家密码标准的安全验签流程,特别关注于使用SM2算法对接收到的发卡行公钥证书进行验证的具体步骤。文章详细说明了如何从证书中提取关键数据,并通过SM3算法计算中间值ZA和h,最终通过Verify函数完成验签。
摘要由CSDN通过智能技术生成

转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/26740237


作者:小马


只对CA公钥验签发卡行公钥举例,后面SDA,DDA的流程基本是一样的。下面用的数据是一张带有国密测试数据的卡片实际交易的指令流中提取出来的。

 

一 数据准备

 

终端数据:

RID:A000000333

 

公钥索引: 18

 

CA公钥, 其实是ECC椭圆曲线上的两个坐标点,X,Y,各有32字节

37710FEB7CC3617767874E85509C268E8F931D68773E93A89F39A4247DFE2D28

0FC5BC838353885B6DAD447C8F90116BD9D314047591989F67F319544D42A48B

 

卡片数据:

发卡行公钥证书:

12620513FF123000022504001140C403272DFC6DB11DED45D249679A800244A30FDFC09489E4DBBED8DF1C831A15B03C54713CC2F3D83CBCD7A6FEA01EC5244DCE9A1293FC8E8003502AE8BFC3C8E1D59AF98C6C8E0CCB21267C370C485FADBD1B60CC9E96BE08FBCA2AE4896E65DFD7EDB57613A75E691AE9E35C377FF0C898F8FCE141013C42A52B8C4DD3C41E

 

其中,

发卡行公钥长度: 40

 

发卡行公钥: (分为两部分X,Y)

C403272DFC6DB11DED45D249679A800244A30FDFC09489E4DBBED8DF1C831A15

B03C54713CC2F3D83CBCD7A6FEA01EC5244DCE9A1293FC8E8003502AE8BFC3C8

 

发卡行公钥证书数字签名(分为两部分,R和S):

E1D59AF98C6C8E0CCB21267C370C485FADBD1B60CC9E96BE08FBCA2AE4896E65

DFD7EDB57613A75E691AE9E35C377FF0C898F8FCE141013C42A52B8C4DD3C41E

 

二 验签流程

 

与国际流程不同,国密的验签都没有解密的步骤,公钥都是以明文的形式在公钥证书里保存的,然后签名拼接在最后面。 终端只需要调用SM2接口验签,然后保存公钥即可。

 

验签的计算流程是这样的:

 

a)计算ZA=SM3[ENTLA || IDA || a || b || xG ||yG || xA || yA]。

 

b)计算报文MSG的32字节的HASH值 h:= SM3 [ZA||MSG];

 

c)Verify(PK)[h, S],若函数输出True表示验证正确,若输出False,表示验证失败。

 

MSG是验签输入数据,是发卡行公钥证书中的前几项拼接起来,具体可以看《中国金融集成电路(IC)卡规范第17部分:借记贷记应用安全增强规范》

以下是MSG:

12620513FF123000022504001140C403272DFC6DB11DED45D249679A800244A30FDFC09489E4DBBED8DF1C831A15B03C54713CC2F3D83CBCD7A6FEA01EC5244DCE9A1293FC8E8003502AE8BFC3C8

 

IDA固定设置为16字节定长的十六进制数据0x31, 0x32, 0x33, 0x34, 0x35,0x36, 0x37, 0x38, 0x31, 0x32, 0x33,0x34, 0x35, 0x36, 0x37, 0x38;

 

ENTLA值为两个字节数据0x00,0x80;

 

a,b是国密局选

a,b,XG,YG的值是国密局选定的一个ECC曲线参数,是固定的。

 

a=FFFFFFFE FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFFFFFFFFFC 

b=28E9FA9E 9D9F5E344D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD414D940E93 

Gx=32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589334C74C7 

Gy=BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0

 
XA,YA是CA公钥。

 

数据都有了,用SM3的工具可以计算出来ZA和h,这里就不写具体步骤了。直接给出结果:

 

h:937483D21BE66FDD8C2BE55F6B1157453035CE06EB71901CB0E27411CBC58CD7
ZA:320A0ADACC0A5FBC783FEBE18DA52138B82FB66ECA74ED5A556F53600390B5D7

然后把数据直接直接填进工具验签:

 

 

网上也有些工具,不需要填入ZA和h,工具内部会自动计算这两个摘要。验签成功后,保存发卡行公钥:

 

C403272DFC6DB11DED45D249679A800244A30FDFC09489E4DBBED8DF1C831A15

B03C54713CC2F3D83CBCD7A6FEA01EC5244DCE9A1293FC8E8003502AE8BFC3C8

 

后面的过程类似,不说了。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值