转载请注明出处
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
后面的过程类似,不说了。