1.CPU卡发卡流程
2.dc_request 响应
3.dc_anticoll 防冲突
4.dc_select 选择
5.dc_pro_resethex 复位
6.数据加密码 利用复位返回的数据,加密要写到卡里面的数据
key memcpy(&Key[0], &recbuff[0], 8); memcpy(&Key[8], &recbuff[24], 8);
加密key获得ExpKey ExpandKey((unsigned char*)Key, ExpKey);
把要写到卡里面的数据按照每16字节,用ExpKey 进行加密,计算得到要加密后的数据
7.3DES并进行外部认证
获取随机数 \x00\x84\x00\x00\x08 返回8字节随机数
软件3DES 加密随机数 获取8字节加密数据 加密密钥16字节 \xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF
\xFF\xFF\xFF\xFF\xFF
外部认证 \x00\x82\x00\x00\x08 + 8字节加密后的随机数
删除MF \x80\x0E\x00\x00\x00
选择主文件MF \x00\xA4\x00\x00\x02\x3F\0x00
8.创建密码文件并注入密码
建立key文件 \x80\xE0\x00\x00\x07\x3F\x00\x80\x00\xF0\xFF\xFF
写入00号主控密码 \x80\xD4\x01\x00\x15\x39\xF0\xF0\xAA\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF
\xFF\xFF
写入01号主控密码 \x80\xD4\x01\x01\x15\x39\xF0\xF0\x11\x55\x6D\x57\xAB\xAE\x5B\xFE\x1C\xBA\x76\x4E\xD3\x02\x9E\x9E
\xDF\xF7
9.建立005文件并选择005
建立二进制文件0005
memcpy(sendbuff, “\x80\xE0\x00\x05\x07\x28\x00\x20\xF0\x11\xFF\xFF”, clen);
//空间大小
sendbuff[6] = (Len >> 8);
sendbuff[7] = Len;
选择二进制文件0005 \x00\xA4\x00\x00\x02\x00\x05
10.写数据到卡
Pack = (Len / 0xb0);
Surplus = (Len % 0xb0);
for(i = 0; i < Pack; i++)
{
memset(sendbuff, ‘\0’, sizeof(sendbuff));
memcpy(sendbuff, “\x00\xD6\x00\x00\xb0”, clen);
//偏移位置
Pos = (0xb0 * i);
sendbuff[2] = (unsigned char)(Pos >> 8);
sendbuff[3] = (unsigned char)Pos;
memcpy(&sendbuff[clen], &Temp[i * 0xb0], 0xb0);
clen += 0xb0;
}
if(Surplus != 0)
{
memcpy(sendbuff, “\x00\xD6\x00\x00\xFF”, clen);
sendbuff[4] = (unsigned char)Surplus;
//偏移位置
Pos = (0xb0 * i);
sendbuff[2] = (unsigned char)(Pos >> 8);
sendbuff[3] = (unsigned char)Pos;
memcpy(&sendbuff[clen], &Temp[i * 0xb0], Surplus);
clen += 0xb0;
}