qPBOC脱机消费流程、SDA、DDA等具体数据分析

AIP 1

afl 2

卡片主要参数 2

其他值 2

进入交易流程,选择ppse 3

根据ppse的属性,选择qpboc应用 4

终端数据 4

发送GPO命令 5

组织GPO下发数据 5

从ic卡中的返回数据中取得如下数据元 6

计算返回数据的正确性,过程密钥部分 6

计算返回数据的正确性,ARQC部分 6

读出afl中指明的记录 7

恢复IC发卡行卡公钥 8

检查发卡行公钥的正确性 10

进行SDA认证 11

恢复IC卡公钥 14

验证卡片返回数据的正确性 17

取得返回数据的长度 17

根据返回数据按tlv划分,取得sCVR,卡片验证结果。 17

组织发卡行应用数据 17

生成过程密钥 17

计算密文 17

外部拼接gpo返回数据 18

qpboc从ppse进入交易,先进行交易,再进入认证。

以bctc送检参数31为例,其参数如下

AIP

//QPBOC AIP支持SDA,支持DDA,支持持卡人认证

A1QPBOCAIP = 70 00

(AIP,应用交互特征(Application Interchange Profile)

应用交互特征(AIP)

一个列表,说明此应用中卡片支持指定功能的能力(SDA,标准DDA,CDA,终端风险管理,持卡人验证和发卡行认证)。

AIP在个人化时必须被写入卡中用来指明支持终端风险管理和持卡人验证

AIP格式见规范5

应用交互特征 (AIP)

F: b 16

T: 82

L: 2

M

一个列表,说明此应用中卡片支持指定功能的能力

字节 1:

bit 8: 1 = RFU

bit 7: 1 = 支持SDA

bit 6: 1 = 支持DDA

bit 5: 1 = 支持持卡人认证

bit 4: 1 = 执行终端风险管理

bit 3: 1 = 支持发卡行认证

bit 2: RFU (0)

bit 1: 1 = 支持CDA

字节2: RFU (“00”)

afl

A1QPBOCAFL = 10010300 18010101

表示sfi=2的文件有01-03这几条记录,sfi=3的01条记录是qpboc需要的,且sfi 3的第一条记录是参与静态认证的记录。

卡片主要参数

持卡人姓名_5F20 = “FULL FUNCTIONAL”

磁道2等效数据_57 = 62 28 00 01 00 00 11 17 D3 01 22 01 01 23 45 12 39 99 91

zdycsz = 123 9999

应用主帐号_PAN_5A = 62 28 00 01 00 00 11 17

应用失效日期_5F24 = 30 12 31

应用PAN序列号_5f34 = 01

服务代码_5F30 = 02 01

MSD偏移_9F67 = 31

//应用密文密钥

adf1_应用密文密钥 = 11223344006677881122334455007788

//安全报文认证(MAC)密钥

adf1_安全报文认证_MAC_密钥 = 8B4F854F0831FBF2635A212E4DDDB92A

//安全报文加密密钥

adf1_安全报文加密密钥 = 11220044556677881122330055667788

//动态CVN密钥

adf1_动态CVN密钥 = 62582ADDB9854F0831FBF2635A212E4D

//分散密钥索引

adf1_分散密钥索引 = 01

//密文版本号(取值:01)

adf1_密文版本号 = 01

//算法标识

adf1_算法标识 = 01

其他值

//发卡行国家代码(9F57)值为:9F57 02 0156

//应用货币代码(9F51)值为:9F51 02 0156

//连续脱机交易限制(国际-货币)(9F53)值为:9F53 01 03

//连续脱机交易限制(国际-国家)(9F72)值为:9F72 01 00

//应用默认行为(ADA)(9F52)值为:9F52 02 8240(-如果发卡行认证失败,下次联机交易,如果新卡,联机交易,如果在前次交易中PIN尝试次数超限,拒绝交易)

//累计脱机交易金额限制数(9F54)值为:9F54 06 000000010000

//发卡行认证指示位(9F56)值为:80

//日志格式(9F4F)值为:9A039F21039F02069F03069F1A025F2A029F4E149C019F3602

//第二应用货币(9F76)值为:0000

//连续脱机交易下限(9F58)值为:03

//连续脱机交易上限(9F59)值为:07

//cdol1为9F0206 9F0306 9F1A02 9505 5F2A02 9A03 9F2103 9C01 9F3704(授权金额,其它金额,终端国家代码,终端验证结果,交易货币代码、交易日期、交易时间、交易类型、不可预知数)

// 8C18 9F0206 9F0306 9F1A02 9505 5F2A02 9A03 9F2103 9C01 9F3704

// 8C15 9F0206 9F0306 9F1A02 9505 5F2A02 9A03 9C01 9F3704

//cdol2为8A02 9F0206 9F0306 9F1A02 9505 5F2A02 9A03 9F2103 9C01 9F3704(授权响应码,授权金额,其它金额,终端国家代码,终端验证结果,交易货币代码、交易日期、交易时间、交易类型、不可预知数)

// 8D17 8A02 9F0206 9F0306 9F1A02 9505 5F2A02 9A03 9C01 9F3704

// 9F0206 9F0306 9F1A02 9505 5F2A02 9A03 9C01 9F3704

//PDOL数据为9F6604 9F0206 9F0306 9F1A02 9505 5F2A02 9A03 9C01 9F3704(包含终端交易属性、授权金额、其它金额、终端国家代码、终端验证结果、交易货币代码、交易日期、交易类型、不可预知数)

//——-发卡行应用数据中的值(9F10,直接写长度07加数据,值为0701010300000001,用于GAC返回的数据,先初始化,这里不包含发卡行自定义数据)(GPO中,个人化要求发卡行应用数据中不返回可用脱机消费余额)

进入交易流程,选择ppse

reset

//—选择PPSE

00 a4 04 00 ( “2PAY.SYS.DDF01” )

if sw ! = 90 00

pause

endif

set resp

if $ resp ! = 6F30840E325041592E5359532E4444463031A51EBF0C1B61194F07A0000003330101500B50424F4320437265646974870101

?

pause

endif

返回的FCI模板中表明了ppse的属性

根据ppse的属性,选择qpboc应用

//—QPBOC目录

00 a4 04 00 07 A0000003330101

if sw ! = 90 00

pause

endif

set resp

if $ resp ! = 6F5F 8407A0000003330101 A554 500b50424F4320437265646974 870101 9F38189F66049F02069F03069F1A0295055F2A029A039C019F3704 5F2D087A68656E66726465 9F110101 9F120F4341524420494D4147452030303331 BF0C05 9F4D020B0A

?

pause

endif

终端数据

//===================终端数据

//终端国家代码:%TCcode,交易货币代码:%TMcode,授权金额:%AUam,其它金额:%OTam,交易日期:%Tdate,

//交易类型:%Ttype,终端性能:%Tcap,授权响应码:%ARcode,

//终端验证结果1:%TVR1,终端验证结果2:%终端验证结果2,不可预知数1:%UNnum1,不可预知数2:%UNnum2,

//交易证书哈希结果1:%TChash1,交易证书哈希结果2:%TChash2、商户名称:%Mname、交易时间:%Ttime、终端交易属性:%终端交易属性

date = datetime()

终端国家代码 = 00 01

交易货币代码 = 01 56

终端国家代码

指明终端所处的国家。用于应用用途控制中对终端进行检查。参见ISO 3166,中国的国家代码为‘0156’。

授权金额 = 00 00 00 00 10 00

授权金额就是交易金额

其它金额 = 00 00 00 00 00 10

交易日期 = mid( $date, 1, 3 )

交易类型 = 01

终端性能 = e0 f0 f0

授权响应码 = “Y3”

终端验证结果1 = 48 02 03 04 05

终端验证结果2 = 44 02 03 04 05

不可预知数1 = 01 02 03 04

不可预知数2 = 11 12 13 14

交易证书哈希结果1 = 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14

交易证书哈希结果2 = 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24

商户名称 = 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34

交易时间 = mid( $date, 3, 3 )

终端交易属性 = aa 00 00 00

//===========进入第1次交易

//—————-应用初始化——————

// 取处理选项,此过程中,卡片交易属性恢复为个人化时的值,进入QPBOC交易,

// 货币匹配,终端仅支持脱机,授权金额(1000)大于卡片CVM限额(500),

// 终端和卡片都支持签名(卡片交易属性中设置需要签名),

// 进行小额检查(授权金额未超限,备份电子现金余额,设置防备位为1,

// 设置电子现金余额减去授权金额),卡片附加处理中不返回可用脱机脱机消费余额,

// QPBOC AIP中支持DDA,执行fDDA(IC卡私钥768位不大于1024位,返回FDDA), 卡片返回TC, 执行格式2

// 设置防备位为1,卡片交易属性值变为70 00,

// 电子现金余额变为00 00 00 00 90 00(00 00 00 01 00 00 – 00 00 00 00 10 00),

// 返回脱机接受下的GPO响应数据

发送GPO命令

组织GPO下发数据

data1 = $ 终端交易属性 $ 授权金额 $ 其它金额 $ 终端国家代码 $ 终端验证结果1 $ 交易货币代码 $ 交易日期 $ 交易类型 $ 不可预知数1

clen1 = strlen ( $ data1 )

xx_data = 83 $ clen1 $ data1

clen = strlen ( $ xx_data )

clend = strlen ( $ rdata )

80 a8 00 00 $ clen $ xx_data

if sw ! = 90 00

pause

endif

set resp

相关数据如下

DATA1 = AA 00 00 00 00 00 00 00 10 00 00 00 00 00 00 10 00 01 48 02 03 04 05 01 56 12 10 30 01 01 02 03 04

GPO命令为

80A8000023 8321AA0000000000000010000000000000100001480203040501561210300101020304

返回数据为

7781AA82027000940810010300180101019F360200019F260824CF8A71A23939349F1008070101039000000157136228000100001117D3012201012345123999915F3401019F4B606CF9839296AD75632DE847830BBDDF536E3D5DA9C43C58075B1914EA80659D47DBCEB2B7B783D311D35E456FFC4752425BEA8564DB44E282792CF7A8314EBE3FA2CD22B81D3864879223C72E24375F92A60615B2F8056D0E4FC40D2B54EBAFEC9F6C027000

9000

从ic卡中的返回数据中取得如下数据元

ATC = 00 01

sCVR = 03 90 00 00

sCTP = 70 00

计算返回数据的正确性,过程密钥部分

//发卡行应用数据

siadata = 07 $ adf1_分散密钥索引 $ adf1_密文版本号 $ sCVR $ adf1_算法标识

//======计算应用密文(密文版本01)

//计算ADF下的应用密文密钥的过程密钥%A1sack

NATC = xor ( $ ATC , ffff )

Linit = 00 00 00 00 00 00 $ ATC

Rinit = 00 00 00 00 00 00 $ NATC

left = oem_desjs ( $ adf1_应用密文密钥 , $ Linit , 0 )

right = oem_desjs ( $ adf1_应用密文密钥 , $ Rinit , 0 )

A1sack = $ left $ right

相关数据值如下

SIADATA = 07 01 01 01

NATC = FF FE

LINIT = 00 00 00 00 00 00 00 01

RINIT = 00 00 00 00 00 00 FF FE

left = 8A 1B 67 79 17 13 1C D4

right = 99 2C 00 66 80 BF 83 2C

A1SACK = 8A 1B 67 79 17 13 1C D4 99 2C 00 66 80 BF 83 2C

//

计算返回数据的正确性,ARQC部分

//用MAC算法产生8字节应用密文%AC

Tdata = $ 授权金额 $ 其它金额 $ 终端国家代码 $ 终端验证结果1 $ 交易货币代码 $ 交易日期 $ 交易类型 $ 不可预知数1

sCdata = $ AIP $ ATC $ sCVR

ACdata = $ Tdata $ sCdata

xx_rand = 00 00 00 00 00 00 00 00

AC1 = oem_desmac ( $ A1sack , $ ACdata , $ xx_rand , 2 )

相关数据值如下

TDATA = 00 00 00 00 10 00 00 00 00 00 00 10 00 01 48 02 03 04 05 01 56 12 10 30 01 01 02 03 04

SCDATA = 70 00 00 01

ACDATA = 00 00 00 00 10 00 00 00 00 00 00 10 00 01 48 02 03 04 05 01 56 12 10 30 01 01 02 03 04 70 00 00 01

AC1 = B3 65 2B 50 F2 EC 38 1F

读出afl中指明的记录

//READ RECORD

00B2011400

70818C938180817B58E992D032B7F0C0B5E0AA146F53FDD20DE1B3BFD9BFD28D0D7B5D4B69A62E1442847EC0FCED37C41A653AC8AEFF680704607E7D6EDBB683FDF8AE3CBA63FD2FB93845D9DA06F5B6CC09E807A0B69D5CF6FAFFDEC65A3E00C560947E4822FD74D0A4994493C9D5E92F83634C1EE77BC805F838A9A79E114787B65F6B74B99F7406454343313131

9000

//READ RECORD

00B2021400

708183908180229103A5E3120F2D2862091176AA2BD4E24D69E7EEF7B9195C91EA0088AECFF47EDFA0BEEF7C391DF3B05F717DCC06FFC8EEFF90BA14212B8A52AD48B33277B2E230D40B3E76DC59778926F1D8739E106CD741DE06A7423DFBA25E02F12E543D13D1B471806526024981B7D26B4BF6E5558604CCC289F59E8A802F45FB3D9E67

9000

//READ RECORD

00B2031400

7081C49F46818096B3DA7DEADD6F2D3B400F6CB907155A7B686EE6DE3DF2FD2ACD61AA25C33E3CA0343FAC6A0C9AD06A32A48AED7D9507BF0154F9087AAFBD0CF0F72A7008E09F89439C0C79852511075C86AF85787ADB051C0F41CD543474A7FF059C781DC4066287CD971435CF0E8ABD26CD4AB2B6B53AEEBFFC1B73059AB6508B5909FA0AD29F32010392248B643D1EAF2EA784AC205303C90E745EA2EFA5CBF02CC47D47833BB7B27ECC6962385A4B8F01809F47030100019F480A89DD917D3A288B7BDD55

9000

//READ RECORD

00B2011C00

70165A0862280001000011175F24033012315F2503950701

9000

分析tlv可以得到如下数据元

静态签名应用数据

tag_93 = 817B58E992D032B7F0C0B5E0AA146F53FDD20DE1B3BFD9BFD28D0D7B5D4B69A62E1442847EC0FCED37C41A653AC8AEFF680704607E7D6EDBB683FDF8AE3CBA63FD2FB93845D9DA06F5B6CC09E807A0B69D5CF6FAFFDEC65A3E00C560947E4822FD74D0A4994493C9D5E92F83634C1EE77BC805F838A9A79E114787B65F6B74B9

电子现金发卡行授权码(EC Issuer Authorization Code)

tag_9F74 = 454343313131(“ECC111”)

发卡行公钥证书

tag_90 = 229103A5E3120F2D2862091176AA2BD4E24D69E7EEF7B9195C91EA0088AECFF47EDFA0BEEF7C391DF3B05F717DCC06FFC8EEFF90BA14212B8A52AD48B33277B2E230D40B3E76DC59778926F1D8739E106CD741DE06A7423DFBA25E02F12E543D13D1B471806526024981B7D26B4BF6E5558604CCC289F59E8A802F45FB3D9E67

公钥模数

tag_9F46 = 96B3DA7DEADD6F2D3B400F6CB907155A7B686EE6DE3DF2FD2ACD61AA25C33E3CA0343FAC6A0C9AD06A32A48AED7D9507BF0154F9087AAFBD0CF0F72A7008E09F89439C0C79852511075C86AF85787ADB051C0F41CD543474A7FF059C781DC4066287CD971435CF0E8ABD26CD4AB2B6B53AEEBFFC1B73059AB6508B5909FA0AD2

公钥指数

tag_9F47 = 010001

公钥余数

tag_9F48 = 89DD917D3A288B7BDD55

发卡行公钥指数

tag_9F32 = 03

发卡行公钥余数

tag_92 = 8B643D1EAF2EA784AC205303C90E745EA2EFA5CBF02CC47D47833BB7B27ECC6962385A4B

CA公钥索引

tag_8F = 80

应用PAN

tag_5A = 6228000100001117

应用失效日期

tag_5F24 = 301231

应用生效日期

tag_5F25 = 950701

恢复IC发卡行卡公钥

用CA公钥对发卡行公钥证书(tag_90)进行rsa加密

CA公钥 =

CC DB A6 86 E2 EF B8 4C E2 EA 01 20 9E EB 53

BE F2 1A B6 D3 53 27 4F F8 39 1D 70 35 D7 6E

21 56 CA ED D0 75 10 E0 7D AF CA CA BB 7C CB

09 50 BA 2F 0A 3C EC 31 3C 52 EE 6C D0 9E F0

04 01 A3 D6 CC 5F 68 CA 5F CD 0A C6 13 21 41

FA FD 1C FA 36 A2 69 2D 02 DD C2 7E DA 4C D5

BE A6 FF 21 91 3B 51 3C E7 8B F3 3E 68 77 AA

5B 60 5B C6 9A 53 4F 37 77 CB ED 63 76 BA 64

9C 72 51 6A 7E 16 AF 85

指数E为 010001

发卡行认证哈希结果

25 B6 25 38 31 E1 22 0C C4 3B 46 89 EE 36 F6 3B F7 B0 29 FA

//rsa_pub_encode ( int ( 1024 ) , 01 00 01 , CC DB A6 86 E2 EF B8 4C E2 EA 01 20 9E EB 53BE F2 1A B6 D3 53 27 4F F8 39 1D 70 35 D7 6E21 56 CA ED D0 75 10 E0 7D AF CA CA BB 7C CB09 50 BA 2F 0A 3C EC 31 3C 52 EE 6C D0 9E F004 01 A3 D6 CC 5F 68 CA 5F CD 0A C6 13 21 41FA FD 1C FA 36 A2 69 2D 02 DD C2 7E DA 4C D5BE A6 FF 21 91 3B 51 3C E7 8B F3 3E 68 77 AA5B 60 5B C6 9A 53 4F 37 77 CB ED 63 76 BA 649C 72 51 6A 7E 16 AF 85 , 229103A5E3120F2D2862091176AA2BD4E24D69E7EEF7B9195C91EA0088AECFF47EDFA0BEEF7C391DF3B05F717DCC06FFC8EEFF90BA14212B8A52AD48B33277B2E230D40B3E76DC59778926F1D8739E106CD741DE06A7423DFBA25E02F12E543D13D1B471806526024981B7D26B4BF6E5558604CCC289F59E8A802F45FB3D9E67 )

//—-int

//—- input = 1024 hex = 00 00 04 00

//

//–rsa public key encrypt

//–input = 22 91 03 A5 E3 12 0F 2D 28 62 09 11 76 AA 2B D4 E2 4D 69 E7 EE F7 B9 19 5C 91 EA 00 88 AE CF F4 7E DF A0 BE EF 7C 39 1D F3 B0 5F 71 7D CC 06 FF C8 EE FF 90 BA 14 21 2B 8A 52 AD 48 B3 32 77 B2 E2 30 D4 0B 3E 76 DC 59 77 89 26 F1 D8 73 9E 10 6C D7 41 DE 06 A7 42 3D FB A2 5E 02 F1 2E 54 3D 13 D1 B4 71 80 65 26 02 49 81 B7 D2 6B 4B F6 E5 55 86 04 CC C2 89 F5 9E 8A 80 2F 45 FB 3D 9E 67

//

//–output = 6A 02 62 28 00 FF 12 30 00 00 01 01 01 80 01 BE ED 0D 6A 8D AC 95 07 15 40 85 6B 8F 13 03 85 BF FF A8 45 1F 15 E1 67 6E DE DD F1 AB BF FD E4 B9 6E 6E BD 51 45 F3 14 DB 60 6F 44 BD 84 8C B3 8D C5 00 43 1C 6A 82 B0 A7 0D CC D5 BC B6 E6 A9 14 9C FB 8E B5 3F 52 AA D4 7D 12 A8 00 C5 5D 79 FC EF F7 48 56 99 AB 61 2F F3 34 15 25 B6 25 38 31 E1 22 0C C4 3B 46 89 EE 36 F6 3B F7 B0 29 FA BC

检查证书格式

表 6:从发卡行公钥证书恢复数据的格式

字段名

长度

描述

格式

恢复数据头

1

十六进制,值为‘6A’

B

证书格式

1

十六进制,值为‘02’

B

发卡行标识

4

主帐号最左面的3-8个数字(在右边补上十六进制数‘F’)

cn 8

证书失效日期

2

MMYY,在此日期后,这张证书无效

n4

证书序列号

3

由认证中心分配给这张证书的,唯一的二进制数

B

哈希算法标识

1

标识用于在数字签名方案中产生哈希结果的哈希算法

B

发卡行公钥算法标识

1

标识使用在发卡行公钥上的数字签名算法

B

发卡行公钥长度

1

标识发卡行公钥的模的字节长度

B

发卡行公钥指数长度

1

标识发卡行公钥指数的字节长度

B

发卡行公钥或发卡行公钥的最左边字节

NCA-36

如果NI≤NCA–36,这个字段包含了在右边补上了NCA–36–NI 个值为‘BB’的字节的整个发卡行公钥。

如果NI >NCA-36,这个字段包含了发卡行公钥最高位的NCA–36个字节

B

哈希结果

20

发卡行公钥以及相关信息的哈希值

B

恢复数据结尾

1

十六进制,值为‘BC’

b

  1. 如果发卡行公钥证书的长度不同于在前面的过程中获得的认证中心公钥模长度,那么静态数据认证失败。
  2. 为了获得在表 6中指明的恢复数据,使用认证中心公钥和相应的算法按照11.2.1节中指明的恢复函数恢复发卡行公钥证书。如果恢复数据的结尾不等于‘BC’,那么静态数据认证失败。
  3. 检查恢复数据头。如果它不是‘6A’,那么静态数据认证失败。
  4. 检查证书格式。如果它不是‘02’,那么静态数据认证失败。
  5. 将表 6中的第二个到第十个数据元素(即从证书格式直到发卡行公钥或发卡行公钥的最左边字节)从左到右连接,再把发卡行公钥的余项加在后面(如果有),最后是发卡行公钥指数。
  6. 使用指定的哈希算法(从哈希算法标识得到)对上一步的连接结果计算得到哈希结果。
  7. 把上一步计算得到的哈希结果和恢复出的哈希结果相比较。如果它们不一样,那么静态数据认证失败。
  8. 检验发卡行标识是否匹配主帐号最左面的3-8个数字(允许发卡行标识可能在其后补‘F’)。如果不一致,那么静态数据认证失败。
  9. 检验证书失效日期中指定月的最后日期是否等于或迟于今天的日期。如果证书失效日期在今天的日期之前,那么证书已过期,静态数据认证失败。
  10. 检验连接起来的RID、认证中心公钥索引、证书序列号是否有效。如果无效,那么静态数据认证失败。
  11. 如果发卡行公钥算法标识无法识别,那么静态数据认证失败。
  12. 如果以上所有的检验都通过,连接发卡行公钥的最左边字节和发卡行公钥的余项(如果有)以得到发卡行公钥模,以继续下一步签名的静态应用数据的检验。

能够得到发卡行公钥长度为0x80,发卡行指数长度为0x01

发卡行公钥的最左边部分 = BE ED 0D 6A 8D AC 95 07 15 40 85 6B 8F 13 03 85 BF FF A8 45 1F 15 E1 67 6E DE DD F1 AB BF FD E4 B9 6E 6E BD 51 45 F3 14 DB 60 6F 44 BD 84 8C B3 8D C5 00 43 1C 6A 82 B0 A7 0D CC D5 BC B6 E6 A9 14 9C FB 8E B5 3F 52 AA D4 7D 12 A8 00 C5 5D 79 FC EF F7 48 56 99 AB 61 2F F3 34 15

前面已经得到发卡行余项数据为

8B643D1EAF2EA784AC205303C90E745EA2EFA5CBF02CC47D47833BB7B27ECC6962385A4B

两项拼接结果为

发卡行公钥 = BEED0D6A8DAC95071540856B8F130385BFFFA8451F15E1676EDEDDF1ABBFFDE4B96E6EBD5145F314DB606F44BD848CB38DC500431C6A82B0A70DCCD5BCB6E6A9149CFB8EB53F52AAD47D12A800C55D79FCEFF7485699AB612FF334158B643D1EAF2EA784AC205303C90E745EA2EFA5CBF02CC47D47833BB7B27ECC6962385A4B

检查发卡行公钥的正确性

表 3:由认证中心签名的发卡行公钥数据(即哈希算法的输入)

字段名

长度

描述

格式

证书格式

1

十六进制,值为‘02’

b

发卡行标识

4

主帐号最左面的3-8个数字。(在右边补上十六进制数‘F’)

cn 8

证书失效日期

2

MMYY,在此日期后,这张证书无效

n 4

证书序列号

3

由认证中心分配给这张证书的唯一的二进制数

b

哈希算法标识

1

标识用于在数字签名方案中产生哈希结果的哈希算法

b

发卡行公钥算法标识

1

标识使用在发卡行公钥上的数字签名算法

b

发卡行公钥长度

1

标识发卡行公钥模的字节长度

b

发卡行公钥指数长度

1

标识发卡行公钥指数的字节长度

b

发卡行公钥数位或发卡行公钥的最左边部分

NCA – 36

如果NI≤NCA–36,这个字段包含了在右边补上了NCA–36–NI 个值为‘BB’的字节的整个发卡行公钥。

如果NI >NCA-36,这个字段包含了发卡行公钥最高位的NCA–36个字节

b

发卡行公钥余项

0 或NI–NCA+36

这个字段只有在NI>NCA–36时才出现。它包含了发卡行公钥最低位的NI–NCA+36个字节

b

发卡行公钥指数

1或3

发卡行公钥指数等于3或216+1

b

这串数据简单来说,是由

tag_90的“明文中 6a 以后,hash值以前的所有数据” +“发卡行公钥余数92”+“发卡行公钥指数9F32”组成

具体值为

02 62 28 00 FF 12 30 00 00 01 01 01 80 01 BE ED 0D 6A 8D AC 95 07 15 40 85 6B 8F 13 03 85 BF FF A8 45 1F 15 E1 67 6E DE DD F1 AB BF FD E4 B9 6E 6E BD 51 45 F3 14 DB 60 6F 44 BD 84 8C B3 8D C5 00 43 1C 6A 82 B0 A7 0D CC D5 BC B6 E6 A9 14 9C FB 8E B5 3F 52 AA D4 7D 12 A8 00 C5 5D 79 FC EF F7 48 56 99 AB 61 2F F3 34 15 8B643D1EAF2EA784AC205303C90E745EA2EFA5CBF02CC47D47833BB7B27ECC6962385A4B 03

对这串数进行计算sha1_hash

//sha1_hash ( 02 62 28 00 FF 12 30 00 00 01 01 01 80 01 BE ED 0D 6A 8D AC 95 07 15 40 85 6B 8F 13 03 85 BF FF A8 45 1F 15 E1 67 6E DE DD F1 AB BF FD E4 B9 6E 6E BD 51 45 F3 14 DB 60 6F 44 BD 84 8C B3 8D C5 00 43 1C 6A 82 B0 A7 0D CC D5 BC B6 E6 A9 14 9C FB 8E B5 3F 52 AA D4 7D 12 A8 00 C5 5D 79 FC EF F7 48 56 99 AB 61 2F F3 34 15 8B643D1EAF2EA784AC205303C90E745EA2EFA5CBF02CC47D47833BB7B27ECC6962385A4B 03 )

//–sha1_hash

//– input = 02 62 28 00 FF 12 30 00 00 01 01 01 80 01 BE ED 0D 6A 8D AC 95 07 15 40 85 6B 8F 13 03 85 BF FF A8 45 1F 15 E1 67 6E DE DD F1 AB BF FD E4 B9 6E 6E BD 51 45 F3 14 DB 60 6F 44 BD 84 8C B3 8D C5 00 43 1C 6A 82 B0 A7 0D CC D5 BC B6 E6 A9 14 9C FB 8E B5 3F 52 AA D4 7D 12 A8 00 C5 5D 79 FC EF F7 48 56 99 AB 61 2F F3 34 15 8B 64 3D 1E AF 2E A7 84 AC 20 53 03 C9 0E 74 5E A2 EF A5 CB F0 2C C4 7D 47 83 3B B7 B2 7E CC 69 62 38 5A 4B 03

//– output = 25 B6 25 38 31 E1 22 0C C4 3B 46 89 EE 36 F6 3B F7 B0 29 FA

比较卡外计算出来的hash值与卡内公钥证书带的hash值是否一致,一致表明发卡行公钥恢复成功。

进行SDA认证

在SDA处理中,终端使用公钥技术验证卡片中的关键数据自发卡后没有被改动。

终端在SDA处理中使用的卡片数据在下表中列出。

表 12:SDA中使用的卡片数据

数据元

描述

CA公钥索引(PKI)

和发卡行公钥证书一起由CA提供。定义了终端里用于认证发卡行公钥证书的CA公钥

发卡行公钥证书

证书中包括了使用CA私钥签名的发卡行公钥

发卡行公钥指数

用于RSA算法中恢复发卡行公钥证书。值为3或65537

发卡行公钥余项

发卡行公钥没有包含在发卡行公钥证书中的部分(如果有)

AID中的注册应用标识部分(RID)

和CA公钥索引一起用来标识终端中的公钥

签名的静态应用数据(SAD)

一个用来验证卡片静态数据的签名。在卡片个人化阶段,使用发卡行私钥签名的SAD保存在卡片中。推荐下列数据用来生成签名:

应用交互特征AIP(如果支持DDA)

应用生效日期

应用失效日期

应用主账号

应用主账号序列号

应用用途控制AUC

持卡人验证方法(CVM)列表

发卡行行为代码——缺省

发卡行行为代码——拒绝

发卡行行为代码——联机

发卡行国家代码(“5F28”)

如果应用中签名的数据不是唯一,卡片必须支持多个SAD。举例来说,卡片给国内和国际交易分别设置CVM列表,而CVM列表是签名数据。

如果发行后的卡片有修改签名数据的能力,则卡片必须支持修改SAD的能力。

SDA标签列表

如果AIP也要签名,SDA标识列表包括AIP的标签,如果支持DDA则建议将AIP做签名。除了AIP不能有其它数据标签。

下表中是和SDA相关的卡片内部数据。

表 13:和SDA相关的卡片数据

数据元

描述

卡片验证结果(CVR)

包括一个给后续交易参考的指示位,指示位在卡片行为分析时设置表明上次脱机拒绝交易的SDA失败

SDA失败指示位

如果SDA失败并且交易脱机拒绝,在卡片行为分析过程中设置此位。根据发卡行认证的条件,在下一次联机交易的交易结束步骤中,此指示位复位。

在SDA过程中,卡片不需要终端数据。

SDA操作没有使用命令。

在SDA处理中,终端使用公钥验证技术恢复和验证发卡行公钥,并且验证卡片中的SAD。详细描述见安全规范5.2静态数据认证(SDA).。概括的描述如下:

  1. 检索CA公钥

终端使用卡片中的PKI和RID确定使用哪一个CA公钥

  1. 恢复发卡行公钥

终端使用CA公钥验证卡片中的发卡行证书并恢复证书中的发卡行公钥

  1. 验证签名的静态应用数据
    1. 恢复哈希结果
    2. 计算哈希
    3. 比较哈希结果

如果所有的SDA步骤都成功,SDA通过。

参与验证的静态应用数据为

应用交互特征AIP(如果支持DDA)

82

70 00

应用生效日期

5f25

95 07 01

应用失效日期

5f24

 

应用主账号

5f34

 

应用主账号序列号

5a

 

应用用途控制AUC

9f07

 

持卡人验证方法(CVM)列表

8e

 

发卡行行为代码——缺省

9f0d

 

发卡行行为代码——拒绝

9f0e

 

发卡行行为代码——联机

9f0f

 

发卡行国家代码(“5F28”)

5f28

 

实际使用值为

5A086228000100001117 5F2403301231 5F2503950701

表 4:由发卡行签名的静态应用数据(即哈希算法的输入)

字段名

长度

描述

格式

签名数据格式

1

十六进制,值为‘03’

b

哈希算法标识

1

标识用于在数字签名方案中产生哈希结果的哈希算法

b

数据验证代码

2

由发卡行分配的代码

b

填充字节

NI–26

填充字节由NI–26个值为‘BB’的字节组成3

b

需认证的静态数据

变长

在《中国金融集成电路(IC)卡规范借记/贷记卡片规范》9.3.1节指明的需认证的静态数据(参见下文)

最终的结果为

03 01 DA C1 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 5A 08 62 28 00 01 00 00 11 17 5F 24 03 30 12 31 5F 25 03 95 07 01

对这串数据进行hash,结果应该与ic卡内“参与静态认证的数据”一致

//sha1_hash ( 03 01 DA C1 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 5A 08 62 28 00 01 00 00 11 17 5F 24 03 30 12 31 5F 25 03 95 07 01 )

//–sha1_hash

//– input = 03 01 DA C1 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 5A 08 62 28 00 01 00 00 11 17 5F 24 03 30 12 31 5F 25 03 95 07 01

//– output = 2F 95 FA DB 05 BE 23 D2 6E 8D 5C DF D8 07 6B 74 1B 2F 3E 97

参与静态认证的数据tag_93 = 817B58E992D032B7F0C0B5E0AA146F53FDD20DE1B3BFD9BFD28D0D7B5D4B69A62E1442847EC0FCED37C41A653AC8AEFF680704607E7D6EDBB683FDF8AE3CBA63FD2FB93845D9DA06F5B6CC09E807A0B69D5CF6FAFFDEC65A3E00C560947E4822FD74D0A4994493C9D5E92F83634C1EE77BC805F838A9A79E114787B65F6B74B9

用发卡行公钥进行恢复。

//rsa_pub_encode ( int ( 1024 ) , 03 , BEED0D6A8DAC95071540856B8F130385BFFFA8451F15E1676EDEDDF1ABBFFDE4B96E6EBD5145F314DB606F44BD848CB38DC500431C6A82B0A70DCCD5BCB6E6A9149CFB8EB53F52AAD47D12A800C55D79FCEFF7485699AB612FF334158B643D1EAF2EA784AC205303C90E745EA2EFA5CBF02CC47D47833BB7B27ECC6962385A4B , 81 7B 58 E9 92 D0 32 B7 F0 C0 B5 E0 AA 14 6F 53 FD D2 0D E1 B3 BF D9 BF D2 8D 0D 7B 5D 4B 69 A6 2E 14 42 84 7E C0 FC ED 37 C4 1A 65 3A C8 AE FF 68 07 04 60 7E 7D 6E DB B6 83 FD F8 AE 3C BA 63 FD 2F B9 38 45 D9 DA 06 F5 B6 CC 09 E8 07 A0 B6 9D 5C F6 FA FF DE C6 5A 3E 00 C5 60 94 7E 48 22 FD 74 D0 A4 99 44 93 C9 D5 E9 2F 83 63 4C 1E E7 7B C8 05 F8 38 A9 A7 9E 11 47 87 B6 5F 6B 74 B9 )

//—-int

//—- input = 1024 hex = 00 00 04 00

//

//–rsa public key encrypt

//–input = 81 7B 58 E9 92 D0 32 B7 F0 C0 B5 E0 AA 14 6F 53 FD D2 0D E1 B3 BF D9 BF D2 8D 0D 7B 5D 4B 69 A6 2E 14 42 84 7E C0 FC ED 37 C4 1A 65 3A C8 AE FF 68 07 04 60 7E 7D 6E DB B6 83 FD F8 AE 3C BA 63 FD 2F B9 38 45 D9 DA 06 F5 B6 CC 09 E8 07 A0 B6 9D 5C F6 FA FF DE C6 5A 3E 00 C5 60 94 7E 48 22 FD 74 D0 A4 99 44 93 C9 D5 E9 2F 83 63 4C 1E E7 7B C8 05 F8 38 A9 A7 9E 11 47 87 B6 5F 6B 74 B9

//

//–output = 6A 03 01 DA C1 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB 2F 95 FA DB 05 BE 23 D2 6E 8D 5C DF D8 07 6B 74 1B 2F 3E 97 BC

表 7:从签名的静态应用数据恢复数据的格式

字段名

长度

描述

格式

恢复数据头

1

十六进制,值为‘6A’

b

签名数据格式

1

十六进制,值为‘03’

b

哈希算法标识

1

标识用于在数字签名方案中产生哈希结果的哈希算法

b

数据验证代码

2

由发卡行分配的代码

b

填充字节

NI–26

填充字节由NI–26个值为‘BB’的字节组成

b

哈希结果

20

需认证的静态应用数据的哈希值

b

恢复数据结尾

1

十六进制,值为‘BC’

b

  1. 如果签名静态应用数据的长度不等于发卡行公钥模的长度,那么静态数据认证失败。
  2. 为了获得在表 7中指明的恢复数据,使用发卡行公钥和相应的算法并将11.2.1节中指明的恢复函数应用到签名的静态应用数据上。如果恢复数据的结尾不等于‘BC’,那么静态数据认证失败。
  3. 检查恢复数据头。如果它不是‘6A’,那么静态数据认证失败。
  4. 检查签名数据格式。如果它不是‘03’,那么静态数据认证失败。
  5. 将表 7中的第二个到第五个数据元素(即从签名数据格式直到填充字节)从左到右连接,再把《中国金融集成电路(IC)卡规范借记/贷记卡片规范》9.3.1节中指明的需认证的静态数据加在后面。如果静态数据认证标签列表存在,并且其包含非‘82’的标签,那么静态数据认证失败。
  6. 把指定的哈希算法(从哈希算法标识得到)应用到上一步的连接结果从而得到哈希结果。
  7. 把上一步计算得到的哈希结果和恢复出的哈希结果相比较。如果它们不一样,那么静态数据认证失败。
  8. 如果以上所有的步骤都成功,那么静态数据认证成功。在表 7中的恢复得到的数据验证代码应被存放在标签‘9F45’中。

恢复IC卡公钥

用发卡行公钥恢复ic卡公钥,用发卡行公钥对9f46进行加密

//rsa_pub_encode ( int ( 1024 ) , 03 , BEED0D6A8DAC95071540856B8F130385BFFFA8451F15E1676EDEDDF1ABBFFDE4B96E6EBD5145F314DB606F44BD848CB38DC500431C6A82B0A70DCCD5BCB6E6A9149CFB8EB53F52AAD47D12A800C55D79FCEFF7485699AB612FF334158B643D1EAF2EA784AC205303C90E745EA2EFA5CBF02CC47D47833BB7B27ECC6962385A4B , 96B3DA7DEADD6F2D3B400F6CB907155A7B686EE6DE3DF2FD2ACD61AA25C33E3CA0343FAC6A0C9AD06A32A48AED7D9507BF0154F9087AAFBD0CF0F72A7008E09F89439C0C79852511075C86AF85787ADB051C0F41CD543474A7FF059C781DC4066287CD971435CF0E8ABD26CD4AB2B6B53AEEBFFC1B73059AB6508B5909FA0AD2 )

//—-int

//—- input = 1024 hex = 00 00 04 00

//

//–rsa public key encrypt

//–input = 96 B3 DA 7D EA DD 6F 2D 3B 40 0F 6C B9 07 15 5A 7B 68 6E E6 DE 3D F2 FD 2A CD 61 AA 25 C3 3E 3C A0 34 3F AC 6A 0C 9A D0 6A 32 A4 8A ED 7D 95 07 BF 01 54 F9 08 7A AF BD 0C F0 F7 2A 70 08 E0 9F 89 43 9C 0C 79 85 25 11 07 5C 86 AF 85 78 7A DB 05 1C 0F 41 CD 54 34 74 A7 FF 05 9C 78 1D C4 06 62 87 CD 97 14 35 CF 0E 8A BD 26 CD 4A B2 B6 B5 3A EE BF FC 1B 73 05 9A B6 50 8B 59 09 FA 0A D2

//

//–output = 6A 04 62 28 00 01 00 00 11 17 FF FF 12 31 00 00 01 01 01 60 03 C5 BD 39 EF F9 3A C4 95 A7 71 65 3D 66 34 1F 66 0E 8D F3 12 37 C0 A2 87 29 66 1C 45 C9 F4 38 4C F2 6F 68 7B 69 FB 71 7C 75 95 B4 D2 6B 53 34 59 BC 1F C4 36 76 23 65 4C 29 BA EF 47 3F D0 85 C1 91 EC 96 26 E5 79 E2 33 33 22 94 4A C7 C3 1E 85 09 28 FD 8B 09 82 0E BB C8 BE 29 28 C4 3C 6E 9E 1D F5 94 C5 1D CD 2A 82 72 1D BC

检查ic卡公钥恢复的证书格式

表 12:从IC卡公钥证书恢复数据的格式

字段名

长度

描述

格式

恢复数据头

1

十六进制,值为‘6A’

b

证书格式

1

十六进制,值为‘04’

b

应用主帐号

10

主帐号(在右边补上十六进制数‘F’)

cn 20

证书失效日期

2

MMYY,在此日期后,这张证书无效

n4

证书序列号

3

由发卡行分配给这张证书的唯一的二进制数

b

哈希算法标识

1

标识用于在数字签名方案中产生哈希结果的哈希算法

b

IC卡公钥算法标识

1

标识使用在IC卡公钥上的数字签名算法

b

IC卡公钥长度

1

标识IC卡公钥的模的字节长度

b

IC卡公钥指数长度

1

标识IC卡公钥指数的字节长度

b

IC卡公钥或IC卡公钥的最左边字节

NI-42

如果NIC≤NI–42,这个字段包含了在右边补上了NI–42–NIC 个值为‘BB’的字节的整个IC卡公钥。

如果NIC >NI -42,这个字段包含了IC卡公钥最高位的NI–42个字节

b

哈希结果

20

IC卡公钥以及相关信息的哈希值

b

恢复数据结尾

1

十六进制,值为‘BC’

b

  1. 如果IC卡公钥证书的长度不同于在前面的章节中获得的发卡行公钥模长度,那么动态数据认证失败。
  2. 为了获得在表 12中指明的恢复数据,使用发卡行公钥和相应的算法将11.2.1节中指明的恢复函数应用到IC卡公钥证书上。如果恢复数据的结尾不等于‘BC’,那么动态数据认证失败。
  3. 检查恢复数据头。如果它不是‘6A’,那么动态数据认证失败。
  4. 检查证书格式。如果它不是‘04’,那么动态数据认证失败。
  5. 将表 12:中的第二个到第十个数据元素(即从证书格式直到IC卡公钥或IC卡公钥的最左边字节)从左到右连接,再把IC卡公钥的余项(如果有)和IC卡公钥指数加在后面,最后是《中国金融集成电路(IC)卡规范借记贷记卡片规范》9.3.1节指明的需认证的静态数据。如果静态数据认证标签列表存在,并且其包含非‘82’的标签,那么动态数据认证失败。
  6. 把指定的哈希算法(从哈希算法标识得到)应用到上一步的连接结果从而得到哈希结果。
  7. 把上一步计算得到的哈希结果和恢复出的哈希结果相比较。如果它们不一样,那么动态数据认证失败。
  8. 比较恢复得到的主帐号和从IC卡读出的应用主帐号是否相同。如果不同,那么动态数据认证失败。
  9. 检验证书失效日期中指定月的最后日期是否等于或迟于今天的日期。如果不是,那么动态数据认证失败。
  10. 如果IC卡公钥算法标识无法识别,那么动态数据认证失败。
  11. 如果以上所有的检验都通过,连接IC卡公钥的最左边字节和IC卡公钥的余项(如果有)以得到发卡行公钥模,继续按下面章节的描述执行实际的动态数据认证。

验证ic卡公钥的正确性。

表 9:由发卡行签名的IC卡公钥数据(即哈希算法的输入)

字段名

长度

描述

格式

证书格式

1

十六进制,值为‘04’

b

应用主帐号

10

主帐号(在右边补上十六进制数‘F’)

cn 20

证书失效日期

2

MMYY,在此日期后,这张证书无效

n4

证书序列号

3

由发卡行分配给这张证书的唯一的二进制数

b

哈希算法标识

1

标识用于在数字签名方案中产生哈希结果的哈希算法

b

IC卡公钥算法标识

1

标识使用在IC卡公钥上的数字签名算法

b

IC卡公钥长度

1

标识IC卡公钥的模的字节长度

b

IC卡公钥指数长度

1

标识IC卡公钥指数的字节长度

b

IC卡公钥或IC卡公钥的最左边字节

NI – 42

如果NIC≤NI–42,这个字段包含了在右边补上了NI–42–NIC 个值为‘BB’的字节的整个IC卡公钥。

如果NIC>NI –42,这个字段包含了IC卡公钥最高位的NI–42个字节

b

IC卡公钥的余项

0 或

NIC–NI+42

这个字段只有在NIC >NI –42时才出现。它包含了IC卡公钥最低位的NIC–NI+42个字节

b

IC卡公钥指数

1或3

IC卡公钥指数等于3或216+1

b

需认证的静态数据

变长

在《中国金融集成电路(IC)卡规范借记贷记卡片规范》9.3.1节详细说明了需认证的静态数据(参见下文)

b

这串数据简单来说,是由

tag_9f46的“明文第2到第10个项” +“IC卡公钥余数9f47”+“ic卡公钥指数9F48” +“参与静态签名的数据” 组成

具体值为

04 62 28 00 01 00 00 11 17 FF FF 12 31 00 00 01 01 01 60 03 C5 BD 39 EF F9 3A C4 95 A7 71 65 3D 66 34 1F 66 0E 8D F3 12 37 C0 A2 87 29 66 1C 45 C9 F4 38 4C F2 6F 68 7B 69 FB 71 7C 75 95 B4 D2 6B 53 34 59 BC 1F C4 36 76 23 65 4C 29 BA EF 47 3F D0 85 C1 91 EC 96 26 E5 79 E2 33 33 22 94 4A C7 C3 1E 85 09 28 FD 8B 09 82

89DD917D3A288B7BDD55

010001

5A0862280001000011175F24033012315F2503950701

//sha1_hash ( 04 62 28 00 01 00 00 11 17 FF FF 12 31 00 00 01 01 01 60 03 C5 BD 39 EF F9 3A C4 95 A7 71 65 3D 66 34 1F 66 0E 8D F3 12 37 C0 A2 87 29 66 1C 45 C9 F4 38 4C F2 6F 68 7B 69 FB 71 7C 75 95 B4 D2 6B 53 34 59 BC 1F C4 36 76 23 65 4C 29 BA EF 47 3F D0 85 C1 91 EC 96 26 E5 79 E2 33 33 22 94 4A C7 C3 1E 85 09 28 FD 8B 09 82 89DD917D3A288B7BDD55 010001 5A0862280001000011175F24033012315F2503950701 )

//–sha1_hash

//– input = 04 62 28 00 01 00 00 11 17 FF FF 12 31 00 00 01 01 01 60 03 C5 BD 39 EF F9 3A C4 95 A7 71 65 3D 66 34 1F 66 0E 8D F3 12 37 C0 A2 87 29 66 1C 45 C9 F4 38 4C F2 6F 68 7B 69 FB 71 7C 75 95 B4 D2 6B 53 34 59 BC 1F C4 36 76 23 65 4C 29 BA EF 47 3F D0 85 C1 91 EC 96 26 E5 79 E2 33 33 22 94 4A C7 C3 1E 85 09 28 FD 8B 09 82 89 DD 91 7D 3A 28 8B 7B DD 55 01 00 01 5A 08 62 28 00 01 00 00 11 17 5F 24 03 30 12 31 5F 25 03 95 07 01

//– output = 0E BB C8 BE 29 28 C4 3C 6E 9E 1D F5 94 C5 1D CD 2A 82 72 1D

IC卡公钥已经完全正确了

验证卡片返回数据的正确性

7781AA

8202 7000

9408 1001030018010101

9F3602 0001

9F2608 24CF8A71A2393934

9F1008 0701010390000001

5713 6228000100001117D301220101234512399991

5F3401 01

9F4B60 6CF9839296AD75632DE847830BBDDF536E3D5DA9C43C58075B1914EA80659D47DBCEB2B7B783D311D35E456FFC4752425BEA8564DB44E282792CF7A8314EBE3FA2CD22B81D3864879223C72E24375F92A60615B2F8056D0E4FC40D2B54EBAFEC

9F6C02 7000

取得返回数据的长度

tmp____c = strlen ( $ resp )

//[-]============= TMP____C ============[X]

//AD

//[-]=======================================[-]

根据返回数据按tlv划分,取得sCVR,卡片验证结果。

sCVR = mid ( $ resp , 39 , 4 )

组织发卡行应用数据

//发卡行应用数据

siadata = 07 $ adf1_分散密钥索引 $ adf1_密文版本号 $ sCVR $ adf1_算法标识

//======计算应用密文(密文版本01)

生成过程密钥

//计算ADF下的应用密文密钥的过程密钥%A1sack

NATC = xor ( $ ATC , ffff )

Linit = 00 00 00 00 00 00 $ ATC

Rinit = 00 00 00 00 00 00 $ NATC

left = oem_desjs ( $ adf1_应用密文密钥 , $ Linit , 0 )

right = oem_desjs ( $ adf1_应用密文密钥 , $ Rinit , 0 )

A1sack = $ left $ right

计算密文

//用MAC算法产生8字节应用密文%AC

Tdata = $ 授权金额 $ 其它金额 $ 终端国家代码 $ 终端验证结果1 $ 交易货币代码 $ 交易日期 $ 交易类型 $ 不可预知数1

sCdata = $ AIP $ ATC $ sCVR

ACdata = $ Tdata $ sCdata

xx_rand = 00 00 00 00 00 00 00 00

AC1 = oem_desmac ( $ A1sack , $ ACdata , $ xx_rand , 2 )

外部拼接gpo返回数据

规范12

c1 = strlen ( $ AFL )

c2 = strlen ( $ siadata )

c3 = strlen ( $ 磁道2等效数据_57 )

left = 82 02 $ AIP 94 $ c1 $ AFL 9F36 02 $ ATC 9F26 08 $ AC1 9F10 $ c2 $ siadata 57 $ c3 $ 磁道2等效数据_57 5f34 01 $ 应用PAN序列号_5f34 9f4b $ cic_lofN

sCTP = right( $resp, 2 )

right = 9F6C 02 $ sCTP

clen1 = strlen ( $ left )

clen2 = strlen ( $ right )

clen = add( $ clen1, $ clen2 )

clen = add( $clen, $ cic_lofN )

tt = add( $clen, 03 )

if $ tmp____c ! = $tt

?

pause

endif

//[-]============= LEFT ============[X]

//82 02 70 00 94 08 10 01 03 00 18 01 01 01 9F 36 02 00 01 9F 26 08 24 CF 8A 71 A2 39 39 34 9F 10 08 07 01 01 03 90 00 00 01 57 13 62 28 00 01 00 00 11 17 D3 01 22 01 01 23 45 12 39 99 91 5F 34 01 01 9F 4B 60

//[-]=======================================[-]

//

//[-]============= RIGHT ============[X]

//9F 6C 02 70 00

//[-]=======================================[-]

//

len = add( $clen1, 03 )

len = hex2int( $len )

leftresp = left ( $ resp , $len )

len = hex2int( $clen2 )

tmpvar____00 = right ( $ resp , $ len )

tmpvar____01 = hex2int( $ clen2 )

tmpvar____02 = left ( $ tmpvar____00 , $ tmpvar____01 )

rightresp = $ tmpvar____02

if $ leftresp ! = 77 81 $ clen $ left

?

pause

endif

if $ rightresp ! = $ right

?

pause

endif

//===连接生成FDDA签名的数据

规范7

7.4.5 qPBOC推荐签名数据

对于不支持标准借记/贷记应用(接触)的qPBOC卡,下面这些静态数据元推荐用于签名:

——应用PAN;

——应用失效日期;

——AIP(如果支持fDDA);

——SDA标签列表(如果支持fDDA)。

如果在同一张卡上都支持qPBOC和标准借记/贷记应用(接触),也可以增加JR/T 0025.5中推荐的附加数据元。

恢复签名,并检查格式,(规范7)

表 21:从签名动态应用数据恢复的数据的格式

字段名

长度

描述

格式

恢复数据头

1

十六进制,值为‘6A’

b

签名数据格式

1

十六进制,值为‘05’

b

哈希算法标识

1

标识用于产生交易数据哈希值和数字签名方案中哈希结果的哈希算法

b

IC卡动态数据长度

1

标识IC卡动态数据的字节长度

b

IC卡动态数据

LDD

由IC卡生成和/或存储在IC卡上的动态数据

填充字节

NIC

LDD–25

(NIC-LDD–25)个值为‘BB’的填充字节

b

哈希结果

20

动态应用数据以及相关信息的哈希值

b

恢复数据结尾

1

十六进制,值为‘BC’

b

  1. 如果签名的动态应用数据的长度不同于IC卡公钥模的长度,那么复合动态数据认证/应用密文生成失败。
  2. 为了获得在表 21中指明的恢复数据,使用IC卡公钥和相应的算法并将11.2.1节中指明的恢复函数应用到签名的动态应用数据上。如果恢复数据的结尾不等于‘BC’,那么复合动态数据认证/应用密文生成失败。
  3. 检查恢复数据头。如果它不是‘6A’,那么复合动态数据认证/应用密文生成失败。
  4. 检查签名数据格式。如果它不是‘05’,那么复合动态数据认证/应用密文生成失败。
  5. 从IC卡动态数据中取得表 17中指明的数据。
  6. 检查从IC卡动态数据中取得的密文信息数据是否等于从产生应用密文(GENERATE AC)命令的响应中获得的密文信息数据。如果不等,那么复合动态数据认证/应用密文生成失败。
  7. 将表 21中的第二个到第六个数据元素(即从签名数据格式直到填充字节)从左到右连接,再把不可预知数加在后面。
  8. 把指定的哈希算法(从哈希算法标识得到)应用到上一步的连接结果从而得到哈希结果。
  9. 把上一步计算得到的哈希结果和恢复出的哈希结果相比较。如果它们不一样,那么复合动态数据认证/应用密文生成失败。

检查fdda签名的格式

//rsa_pub_encode ( int ( 768 ) , 010001 , C5 BD 39 EF F9 3A C4 95 A7 71 65 3D 66 34 1F 66 0E 8D F3 12 37 C0 A2 87 29 66 1C 45 C9 F4 38 4C F2 6F 68 7B 69 FB 71 7C 75 95 B4 D2 6B 53 34 59 BC 1F C4 36 76 23 65 4C 29 BA EF 47 3F D0 85 C1 91 EC 96 26 E5 79 E2 33 33 22 94 4A C7 C3 1E 85 09 28 FD 8B 09 82 89DD917D3A288B7BDD55 , 6CF9839296AD75632DE847830BBDDF536E3D5DA9C43C58075B1914EA80659D47DBCEB2B7B783D311D35E456FFC4752425BEA8564DB44E282792CF7A8314EBE3FA2CD22B81D3864879223C72E24375F92A60615B2F8056D0E4FC40D2B54EBAFEC )

//—-int

//—- input = 0768 hex = 00 00 03 00

//

//–rsa public key encrypt

//–input = 6C F9 83 92 96 AD 75 63 2D E8 47 83 0B BD DF 53 6E 3D 5D A9 C4 3C 58 07 5B 19 14 EA 80 65 9D 47 DB CE B2 B7 B7 83 D3 11 D3 5E 45 6F FC 47 52 42 5B EA 85 64 DB 44 E2 82 79 2C F7 A8 31 4E BE 3F A2 CD 22 B8 1D 38 64 87 92 23 C7 2E 24 37 5F 92 A6 06 15 B2 F8 05 6D 0E 4F C4 0D 2B 54 EB AF EC

//

//–output = 6A 05 01 03 02 00 01 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB DF 4C 16 A9 70 2B 0D 79 66 3F D6 8E 6D AA C0 2D E5 93 68 2E BC

按规范7 来拼接动态签名的原文

sicddata = 02 $ ATC

clen = strlen ( $ sicddata )

xlen = sub( $cic_lofN, $clen )

xlen = sub( $xlen, 19 )

xlen = hex2int( $xlen )

fill = oem_strset ( $ xlen , bb , 0 )

msg1 = 05 01 $ clen $ sicddata $ fill

msg2 = $ 不可预知数1

msg = $ msg1 $ msg2

//[-]============= MSG1 ============[X]

//05 01 03 02 00 01 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB

//[-]=======================================[-]

//

//[-]============= MSG2 ============[X]

//01 02 03 04

//[-]=======================================[-]

hash = sha1_hash( $ msg )

x = 6a $ msg1 $ hash bc

//[-]============= HASH ============[X]

//DF 4C 16 A9 70 2B 0D 79 66 3F D6 8E 6D AA C0 2D E5 93 68 2E

//[-]=======================================[-]

//

//[-]============= X ============[X]

//6A 05 01 03 02 00 01 BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB DF 4C 16 A9 70 2B 0D 79 66 3F D6 8E 6D AA C0 2D E5 93 68 2E BC

//[-]=======================================[-]

//

//比较FDDA签名正确性

len = add( $clen1, 03 )

len = hex2int( $len )

length = hex2int( $ cic_lofN )

sign = mid ( $ resp , $ len , $length )

//test = rsapub ( $ sic_N , $ sic_E , $ sign )

test = rsa_pub_encode ( 768, $ sic_E, $ sic_N , $ sign )

if $ test ! = $ x

?

pause

endif


©lalalla,© 1999-2020。
网站备案号:京ICP备09042134号 京公网安备号:11010802013896