今天主要记录下这两天对接的新通道,感觉这个通道的密钥处理很有意思,做了很多很没必要的操作。其实安全性跟提供机构密钥转加密相同。
参数
- ip XX.XX.XX.XX port: XXXX
- TPDU:6006030000
- 商户号:XXXXXXXXXXXXXXX
- 终端号:00000006
- 联机初始密钥:11111111
通联密钥下载业务处理流程
- 测试阶段提供商户号、终端号和初始密码
- 通过提供的商户信息进行签到下载机构主密钥 域60.1取值0x54,获取ITMK,用于加密0x52响应中平台下发的TMK
- 通过下载获得的机构主密钥签到下载终端主密钥 域60.1取值0x52签到-联机密钥更新,获取TMK
- 签到认证并确认下载到的终端主密钥 域60.1取值0x53签到-联机通知密钥更新成功,终端更新TMK成功,通知平台更新
- 通过下载的终端主密钥签到下载工作密钥 域60.1取值0x50开始正式签到,获取工作密钥等信息进行解密
获取ITMK
- 先对初始密钥进行MD5加密
md5pwd==md5PWD(11111111)==BD886460827015E5D605ED44252251
- 对终端号进行前四后四字节反转
TID_1==posNumPerver('00000006')==00060000
- 对反转ASC终端号和固定密钥进行异或
TID_2 ==xor('3030303630303030','CDA8C1AAD0C2D0CB') = FD98F19CE0F2E0FB
- 对TID_2的每个字节除9磨9,每个字节都转为16进制,将除数和模数异或
for (int i = 0; i < TID.length(); i+=2) { String strs = TID.substring(i,i+2); int strs1 = StringTools.hexToDecimal(strs); XTID +=StringTools.intToHex((strs1 / 9) ^ (strs1 % 9)); } 结果:XTID ==FD98F19CE0F2E0FB ==1D181D1210121013
- 上一步的结果后追加固定密钥D6A7B8B6CEDED3C7后与md5PWD异或作为3DES/sm4的KEY
TTEK==(xTID || D6 A7 B8 B6 CE DE D3 C7) xor md5pwd TTEK==06A59576709060063371BD5B8AFBF196
- 用ttek对终端+pwd明文ASC进行加密上送
最后TRD的密文被TTEK作为KEY对TRD的明文做3DES/sm4运算得到; PWD的密文被TTEK作为KEY对PWD的明文做3DES/sm4运算得到; 用TTEK作为KEY对TRD明文+PWD明文共16个字节做sm4运算得到16字节的密文; 06A59576709060063371BD5B8AFBF196 加密 30303036303030303131313131313131 得到上送62域的数据 628CB5FEA83F20DD620EB76335113473
- 54签到上送成功,收到响应62域【628CB5FEA83F20DD620EB76335113473C25E07101340E938983708EE4F98BEFA7912C5F6EB9FEE5999837AD3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000】
62域组成【TRD+PWD+PRD+TMK+TPK+TAK+TRK】
TRD:628CB5FEA83F20DD 解密明文:3030303630303030 </br> PWD:620EB76335113473 解密明文:3131313131313131 </br> PRD:C25E07101340E938 解密明文:2A8FA791F4614F31 </br> TMK:983708EE4F98BEFA7912C5F6EB9FEE59 checkval:99837AD3 </br> TPK:0000000000000000000000000000000000000000 TAK:0000000000000000000000000000000000000000 TRK:0000000000000000000000000000000000000000
- 获取LTEK的密钥对TMK解密对比校验值
LTEK==ITEK= (ITEK_LEFT||ITEK_RIGHT) xor md5PWD
1)ITEK_LEFT=xTID,即按11.5小节算法步骤1和2得到的xTID 2)ITEK_RIGHT为终端随机数的变种xTRD和后台POSP随机数的变种xPRD异或得到。POS解密POSP下发的PRD密文后,得到PRD明文 3)应按照11.5小节步骤1和2,计算出随机数的变种xTRD和xPRD。 xTRD== 1D181D101012101D xPRD== 051508131C0D0F0A ITEK_RIGHT= xTRD xor xPRD==0D15030C1F1F17 4)用变种ITEK_LEFT+ITEK_RIGHT异或md5PWD得到 ITEK ITEK= (ITEK_LEFT||ITEK_RIGHT) xor md5PWD ITEK=1D181D1210121013180D15030C1F1F17xor1BBD886460827015E5D605ED44252251==06A5957670906006FDDB10EE483A3D46 5)用解密出来的ITEK 解密54签到响应的TMK,得到ITMK Itmk= ITEK 解密 tmk itmk== B6C8BA15DC6894C71C1570348319A175 对比校验值
终端主密钥
- 0x52签到响应62域【0000000000000000000000000000000000000000000000004E0A30FA9FCA0A69C6C10B482D7ABC635A0DD8E964EA7FEFB50968C11E890B50E4B2D916B3543EA0342FD6354569DD480000000000000000E63F153CE6B54E795EA36A154871361EAFFD1E0388E95616】拆分同上
- 对终端主密钥进行解密
拿ITMK对此处的TMK进行解密,得到真正的TMK终端主密钥明文,然后对50签到响应的工作密钥转加密进行支付。所以终端主密钥明文为:62D3ABAE5B3BD302C8BC46C23EF2019E
主密钥确认
- 0x53签到属于更新存储密钥.通知上游确认好密钥信息。所以成功响应就可
终端签到
- 0x50签到,到这就为正常的终端签到,获取工作密钥,并用主密钥对工作密钥进行转加密的时候了。操作方式简单,直接组织签到报文上送,对响应62进行拆分。
- 用0x52解密出的TMK解密tpk/tak/trk
tpk==754A5B1F8592FD0E838C1616924CAB40 校验值:171C00BF63074DFC