智能卡无线小板相对于串口无线小板最大的不同是智能卡无线小板上的单片机要模仿真正的智能卡来发送和接收机顶盒的数据,这部分功能将直接决定整个无线GX系统的稳定性。
智能卡常用的通信协议有T0、T1和T14协议,关于这三种通信协议完整的介绍,在很多资料上都能找到,本文不再详细阐述,有兴趣的朋友可以查阅相关书籍。
本章节主要介绍BJST、YXTF、SMSX这三种智能卡的通信协议的关键技术和机顶盒智能卡命令、应答具体格式以及详细说明。
首先介绍一下ATR(Answer To Reset,复位应答)。
当加上供电电压、时钟和复位信号后,智能卡经DATA线送出其复位应答ATR。这个数据串最多含有33字节,总是按分频值(时钟频率转换因子)为372传送的,
这是遵照ISO/IEC7816-3标准的规定。它含有关于传输协议和卡的各种数据,即使在ATR之后的传输协议使用的是不同的分频值(例如:512),也应当用372这个分频值来发送ATR。
这就保证了从任何卡总能接收到一个ATR,而不管传输协议的参数是怎样的。需要大家注意的是,这里强调的是发送ATR的分频值总是372,但是并没有说发送ATR的波特率是固定的,波特率还要看机顶盒的智能卡槽的时钟频率是多少,ATR的波特率 = 机顶盒所加时钟频率/372。常用的机顶盒的智能卡槽的时钟频率有4.515MHz、4.9152MHz和3.5712MHz。
YXTF、 SMSX智能卡用到的是标准的T0协议。BJST所使用的协议类似于T1协议,单不是标准的T1协议,是一种介于T0协议和T1协议之间的协议,我们暂时称之为TN协议。根据调试的经验,这三种智能卡都有一个规律:发送ATR的波特率和ATR之后的机顶盒命令、智能卡应答的波特率相同。
下面我们来看YXTF智能卡命令和应答(按时间先后顺序)。
STB:机顶盒。
Card:智能卡。
STB -> Card:机顶盒发送给智能卡。
Card -> STB:智能卡发送给机顶盒。

智能卡命令或应答
传输方向,命令或应答的详细说明

0x3b 0x6c 0x00 0x00 0x4e 0x54 0x49 0x43 0x30 0x91 0x69 0x00 0x4a 0x03 0x00 0x00
Card -> STB。YXTF的ATR。

0x00 0xa4 0x04 0x00 0x05 0xf9 0x5a 0x54 0x00 0x06
STB -> Card。初始命令。

0x90 0x00
Card -> STB。表示智能卡收到了正确的初始命令

0x80 0x46 0x00 0x00 0x040x01 0x00 0x00 0x04
STB -> Card。获取智能卡号码命令。

0x61 0x04
Card -> STB。告知机顶盒号码占用0x04个字节。

0x00 0xc0 0x00 0x00 0x04
STB -> Card。读取智能卡号码。

0xaa 0xbb 0xcc 0xdd0x90 0x00
Card -> STB。告知机顶盒智能卡号码,并以0x90 0x00结尾告知机顶盒获取智能卡号码的命令被完整而成功地执行。

0x80 0x46 0x00 0x00 0x040x03 0x00 0x00 0x09
STB -> Card。获取智能卡年龄等级命令。

0x61 0x09
Card -> STB。告知机顶盒年龄等级信息占用0x09个字节

0x00 0xc0 0x00 0x00 0x09
STB -> Card。读取智能卡年龄等级信息。

0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒智能卡年龄等级信息,并以0x90 0x00结尾告知机顶盒获取智能卡年龄等级的命令被完整而成功地执行。

0x80 0x44 0x00 0x00 0x08
STB -> Card。读取智能卡运营商信息。

0x17 0x17 0x00 0x00 0x00 0x0a 0x00 0x00 0x90 0x00
Card -> STB。告知机顶盒运营商信息,例如0x1717十进制为5911,表示第一个运营商是电话区号为0591的第一个城市。并以0x90 0x00结尾告知机顶盒获取智能卡年龄等级的命令被完整而成功地执行。

0x80 0x4c 0x00 0x00 0x040xff 0xff 0xff 0xff
STB -> Card。检查智能卡是否需要机卡配对。

0x94 0xb2
Card -> STB。如果为0x94 0xb2,说明此卡需要机卡配对。如果为0x94 0xb1,说明此卡不需要机卡配对。

0x80 0x4c 0x00 0x00 0x040x5e 0xe4 0x82 0xf2
STB -> Card。给卡发送四个配对字节:0x5e 0xe4 0x82 0xf2,看是否能配对成功

0x90 0x00
Card -> STB。如果为0x90 0x00,说明四个配对字节与此卡配对成功。如果回复其他数据,说明配对失败。

0x80 0x46 0x17 0x17 0x040x04 0x00 0x00 0x48
STB -> Card。获取运营商一产品包列表。其中0x17 0x17是运营商一的号码。

0x61 0x48
Card -> STB。告知机顶盒运营商一产品包列表占用0x48个字节

0x00 0xc0 0x00 0x00 0x48
STB -> Card。读取运营商一产品包列表。

0x00….. 0x00(共0x48个) 0x90 0x00
Card -> STB。返回运营商一产品包列表。并以0x90 0x00结尾告知机顶盒获取运营商一产品包列表的命令被完整而成功地执行。

0x80 0x48 0x17 0x17 0x040x81 0x00 0x00 0x3e
STB -> Card。获取运营商一授权信息。其中0x17 0x17是运营商一的号码。

0x61 0x27
Card -> STB。告知机顶盒运营商一授权信息占用0x27个字节

0x00 0xc0 0x00 0x00 0x27
STB -> Card。读取运营商一授权信息。

0x00 0x00 0x09 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x01 0x00 0x00 0x01 0x00
0x00 0x00 0x80 0x00 0x00 0x01 0xff 0xfe
0x00 0x00 0x00 0x02 0x00 0x01 0x00 0x01
0x00 0x01 0x00 0x02 0x00 0x01 0x00 0x040x90 0x00
Card -> STB。返回机顶盒运营商一授权信息。其中前三个字节0x00 0x00 0x09表示授权信息共有0x09条,以后每四个字节作为一条授权信息。例如0x00 0x01 0xff 0xfe表示ID号为65534(0xff fe)的节目,第二个字节0x01表示在界面上显示此节目ID,第二个字节为0x00表示不显示。

0x80 0x46 0x00 0x0a 0x040x04 0x00 0x00 0x48
STB -> Card。获取运营商二产品包列表。其中0x00 0x0a是运营商二的号码。

0x61 0x48
Card -> STB。告知机顶盒运营商二产品包列表占用0x48个字节

0x00 0xc0 0x00 0x00 0x48
STB -> Card。读取运营商二产品包列表。

0x00….. 0x00(共0x48个) 0x90 0x00
Card -> STB。返回运营商二产品包列表。并以0x90 0x00结尾告知机顶盒获取运营商二产品包列表的命令被完整而成功地执行。

0x80 0x48 0x00 0x0a 0x040x81 0x00 0x00 0x3e
STB -> Card。获取运营商二授权信息。其中0x00 0x0a是运营商二的号码。

0x61 0x0b
Card -> STB。告知机顶盒运营商二授权信息占用0x0b个字节

0x00 0xc0 0x00 0x00 0x0b
STB -> Card。读取运营商二授权信息。

0x00 0x00 0x02 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x010x90 0x00
Card -> STB。返回机顶盒运营商一授权信息。其中前三个字节0x00 0x00 0x02表示授权信息共有0x02条。分析方法同上面运营商一授权信息的分析方法。

上面是一个智能卡初始化比较全面的例子。一般的机顶盒不会有这么多初始化命令。
需要说明以下几点:
第一, T0协议的长度字节在第五个字节,长度字节加上5是整个命令的长度。

第二,按照T0协议,机顶盒首先发送命令的前五个字节,等收到了PB(过程字节)之后,再发送后面的字节。不足五个字节的命令一次发完。以读取卡号的命令为例,第一步机顶盒先发送0x80 0x46 0x00 0x00 0x04;第二步智能卡选取第二个字节0x46作为过程字节回复机顶盒;第三步机顶盒再发送后面四个字节0x01 0x00 0x00 0x04;第四步智能卡回复0x61 0x04表示收到了机顶盒命令并成功执行,返回0x04表示卡号信息是四个字节;第五步机顶盒发送0x00 0xc0 0x00 0x00 0x04来读取卡号;第六步智能卡选取第二个字节0x0c作为过程字节回复机顶盒;第七步智能卡发送卡号信息0xaa 0xbb 0xcc 0xdd  0x90 0x00,以0x90 0x00结尾表示收到了机顶盒命令并成功执行。

第三,智能卡接收到五个字节回复第二个字节作为过程字节,然后如何判断这个命令是否已经结束呢?方法是看开头是否是0x00 0xc0开头,如果是,此命令就是长度就是5,智能卡已经收到了完整的数据了。比如读取卡号命令0x00 0xc0 0x00 0x00 0x04,智能卡需要回复0x04个字节的卡号信息;如果不是0x00 0xc0开头,比如0x80 0x46 0x00 0x00 0x04,说明这个命令还有0x04要发。当然也有一个例外,获取运营商命令0x80 0x44 0x00 0x00 0x08,只有五个字节。我们在单片机程序设计中采用了这种方法。

第四,机卡配对技术将作为单独的一章在后文中做详细介绍。

机顶盒对智能卡完成这些初始化的“问题”后,就开始发送ECM。

0x80 0x3a 0x17 0x17 0x53

0xd6 0x2f 0xc0 0x44 0x0f 0x37 0x94 0x7d 0x02 0xba 0xe0 0x6e 0xa3 0x63 0x17 0x30 0xb3 0x8e 0x82 0x5b 0x81 0x9d 0xd9 0x95 0x4d 0xb0 0xd7 0x0d 0x9f 0x51 0xb6 0x57 0x02 0x09 0x00 0x01 0x00 0x01 0xd1 0x8f 0xaa 0x31 0xbe 0x44 0xae 0x40 0x8b 0x2b 0x45 0x12 0xda 0xce 0x50 0x33 0x09 0x00 0x01 0x00 0x03 0x1f 0xc9 0xf9 0xbb 0x80 0x9a 0x10 0x88 0x11 0xd4 0x5d 0x67 0xf9 0x3f 0x30 0x12 0x47 0x5b 0xfb 0x51 0x65 0x20 0x34 0x51

STB -> Card。ECM,共88字节。0x17 0x17是运营商号。

0x61 0x2b

Card -> STB。告知机顶盒运CW共0x2b个字节,让机顶盒来读取。

0x00 0xc0 0x00 0x00 0x2b

STB -> Card。机顶盒读取CW命令。

0x0a 0x17 0x17 0x44 0x0f 0x37 0x94 0x7d 0xab 0xec 0xe1 0x78 0x14 0x58 0xae 0x1a 0x4f 0xec 0x8d 0xc8 0x50 0x3c 0xbb 0x47 0x00 0x0c 0x5e 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

Card -> STB。CW。0xab 0xec 0xe1 0x78 0x14 0x58 0xae 0x1a 0x4f 0xec 0x8d 0xc8 0x50 0x3c 0xbb 0x47是用来解节目的有效数据。

如果用户访问运营商授权信息页面,还有有以下的命令和回复。

智能卡命令或应答
传输方向,命令或应答的详细说明

0x80 0x46 0x00 0x0a 0x040x02 0x00 0x00 0x16
STB -> Card。获取运营商二信息的命令。

0x61 0x16
Card -> STB。

0x00 0xc0 0x00 0x00 0x16
STB -> Card。读取运营商二信息的命令。

0x00 0x0a 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒运营商二信息。

0x80 0x46 0x17 0x17 0x040x02 0x00 0x00 0x16
STB -> Card。获取运营商一信息的命令。

0x61 0x16
Card -> STB。

0x00 0xc0 0x00 0x00 0x16
STB -> Card。读取运营商一信息的命令。

0x17 0x17 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒运营商一信息。

0x80 0x48 0x00 0x0a 0x040x01 0x00 0x00 0x13
STB -> Card。获取运营商二授权信息。

0x61 0x1d
Card -> STB。

0x00 0xc0 0x00 0x00 0x1d
STB -> Card。读取运营商二授权信息。

0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x0c 0xd9 0x00 0x00 0x36 0x38 0xbf 0x7d 0x00 0x00 0x00 0x01 0x00 0x0b 0xe7 0x51 0xa6 0x36 0x38 0xbf 0x7d0x90 0x00
Card -> STB。告知机顶盒运营商二授权信息。其中前三个字节0x00 0x00 0x02表示授权信息共有0x02条,以后每13个字节作为一条授权信息。具体解释同下面运营商一授权信息的解释。

0x80 0x48 0x00 0x0a 0x040x02 0x00 0x00 0x14
STB -> Card。获取运营商二未知信息。

0x61 0x03
Card -> STB。

0x00 0xc0 0x00 0x00 0x03
STB -> Card。读取运营商二未知信息。

0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒运营商二未知信息。

0x80 0x48 0x17 0x17 0x040x01 0x00 0x00 0x13
STB -> Card。获取运营商一授权信息。

0x61 0x78
Card -> STB。

0x00 0x00 0x09 0x00 0x00 0x00 0x00 0x00 0x0c 0xd9 0x00 0x00 0x36 0x38 0xbf 0x7d 0x00 0x00 0x00 0x01 0x00 0x0b 0xe7 0x51 0xa6 0x36 0x38 0xbf 0x7d 0x00 0x00 0x01 0x00 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x00 0x80 0x00 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x01 0xff 0xfe 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x00 0x00 0x02 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x01 0x00 0x01 0x00 0x0e 0x49 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x01 0x00 0x02 0x00 0x0e 0x49 0x73 0x82 0x0f 0xb5 0xbf 0x7d 0x00 0x01 0x00 0x04 0x01 0x0e 0x3d 0x69 0x66 0x0f 0x4b 0x81 0xa50x90 0x00
Card -> STB。告知机顶盒运营商一授权信息。
其中前三个字节0x00 0x00 0x09表示授权信息共有0x09条,以后每13个字节作为一条授权信息。例如0x00 0x01 0xff 0xfe 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d表示ID为65534(0xff fe)的节目授权开始时间为0x0e 0xdf 0x73 0x82,结束时间为0x1d 0xf7 0xbf 0x7d,要在界面上显示出来,没有购买录像。
第二个字节,0x01表示要在机顶盒运营商授权信息页面上显示,0x00表示不显示。
第五个字节,0x00表示此节目没有购买录像,0x01表示此节目购买了录像。

0x80 0x48 0x17 0x17 0x040x02 0x00 0x00 0x14
STB -> Card。获取运营商一未知信息。

0x61 0x03
Card -> STB。

0x00 0xc0 0x00 0x00 0x03
STB -> Card。读取运营商一未知信息。

0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒运营商一未知信息。

下面我们来看SMSX智能卡命令和应答。SMSX与YXTF应答和命令比较相似。

0x3b 0x02 0x17 0x72

Card -> STB。SMSX的ATR。

0x00 0xa4 0x04 0x00 0x02

0x3f 0x00

STB -> Card。初始命令一。
0x90 0x00

Card -> STB。表示智能卡收到了正确的初始命令一

0x00 0xa4 0x04 0x00 0x02

0x4a 0x00

STB -> Card。初始命令二。

0x90 0x00

Card -> STB。表示智能卡收到了正确的初始命令二

0x00 0xb2 0x00 0x05 0x06

0x00 0x01 0xff 0x00 0x01 0xff

STB -> Card。获取智能卡号码命令。

0x61 0x67

Card -> STB。告知机顶盒号码信息占用0x67个字节。

0x00 0xc0 0x00 0x00 0x67

STB -> Card。读取智能卡号码命令。

0x00 0x01 0x64*

0x04 0x11 0x22 0x33*

0x83 0x50 0x11 0x06 0x82 0x31 0x73 0x13*

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xca 0xfd 0xc2 0xeb 0xca 0xd3 0xd1 0xb6 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x02 0x0b 0x5c 0x4b 0xa7 0x09

0x90 0x00

Card -> STB。告知机顶盒智能卡号码,并以0x90 0x00结尾告知机顶盒获取智能卡号码的命令被完整而成功地执行。其中83 50 11 06 82 31 73 13表示完整的智能卡卡号,也就是智能卡背面的条形码号码。0x04 0x11 0x22 0x33换算成相应的十进制68231731表示卡号从倒数第二位到倒数第九位的部分。

0x80 0x32 0x00 0x00 0x44

0x81 0x30 0x41 0x00 0x04 0xce 0x66 0xa3 0x4c 0x7b 0x89 0x70 0x50 0xd4 0x6b 0xae 0x0c 0xb8 0xd8 0x53 0x2e 0x74 0x12 0x03 0x5b 0xcd 0xc7 0x66 0xf6 0x8f 0x0c 0x96 0xa0
0xa0 0xee 0x61 0xff 0x12 0xb2 0xa9 0xea
0xb3 0x16 0xef 0x5e 0xc8 0xf3 0x88 0xff
0x77 0x04 0x4d 0xf9 0x16 0xe0 0xac 0x90 0x97 0x73 0x6b 0x5e 0x24 0xee 0xfd 0xc6 0xbc 0xf4 0x71

STB -> Card。ECM,共73字节。
0x60 0x61 0x2a

Card -> STB。告知机顶盒运CW共0x2a个字节,让机顶盒来读取。
0x00 0xc0 0x00 0x00 0x2a

STB -> Card。机顶盒读取CW命令。
0x04 0xce 0x84 0x03 0x00 0x01 0x00 0x84 0x03 0x00 0x03 0xb0 0xb4 0x04 0x00 0x00 0x00 0x00 0x83 0x16 0xd6 0x31 0x03 0x80 *0xd0 0x8b 0x02 0x5d*0x00*0x42 0x29 0x86 0xf1 0x82 0x1c 0xfc 0x9a*0x00*0x3e 0x80 0x7c 0x3a

0x90 0x00

Card -> STB。CW。其中0xd0 0x8b 0x02 0x5d,0x42 0x29 0x86 0xf1 0x82 0x1c 0xfc 0x9a,0x3e 0x80 0x7c 0x3a是解加扰节目的关键数据。

BJST所使用的TN协议是一种介于T0和T1之间的协议,长度在第三个字节。这种协议不像T0协议那样需要多次发送命令多次回复才能得到一条信息,TN协议只需要一问一答就能获得一条信息。下面我们来看BJST智能卡命令和应答。

0x3b 0xe9 0x00 0x00 0x81 0x31 0xc3 0x45 0x99 0x63 0x74 0x69 0x19 0x99 0x12 0x56 0x10
0xec

Card -> STB。BJST的ATR。18字节。

0x00 0x00 0x05

0x00 0x84 0x00 0x00 0x10 0x91

STB -> Card。初始命令一。第三个字节0x05加上4是整个命令的长度,最后一个字节0x91是前面所有字节异或后得到的校验字节。

0x00 0x00 0x12

0xe4 0x74 0x27 0xee 0xd2 0x9d 0xb0 0x25 0x5e 0xa6 0x98 0x97 0xd6 0xbe 0x10 0xbe 0x90 0x00 0x30

Card -> STB。回复初始命令一。第三个字节0x12加上4是整个命令的长度。

0x00
0x00
0x0e

0x00 0x0c 0x00 0x00 0x10 0xe4 0x74 0x27 0xee
0xd2 0x9d
0xb0 0x25 0x56 0xc7

STB -> Card。初始命令二。

0x00 0x00 0x0a

0xf1 0x3d 0x02 0x84 0xcf 0x51 0x0e 0xe1 0x90 0x00 0xa1

Card -> STB。回复初始命令二。

0x00 0x00 0x0e

0x00 0x0b 0x00 0x00 0x10 0xf1 0x3d 0x02 0x84
0xcf 0x51 0x0e
0xe1 0x56
0x78

STB -> Card。初始命令三。

0x00 0x00 0x02

0x90 0x00 0x92

Card -> STB。回复初始命令三。

0x00 0x00 0x05

0x81 0xd4 0x00 0x01 0x05 0x54

STB -> Card。读取智能卡卡号。

0x00 0x00 0x07

0x00 0x00 0x01 0x33 0x11 0x90 0x00 0xb7

Card -> STB。回复卡号信息。其中0x00 0x01 0x33 0x11换算成十进制78609是卡号。

0x00 0x00 0x05

0x81 0xd0 0x00 0x01 0x08 0x5d

STB -> Card。读取智能卡解析CW的密钥。

0x00 0x00 0x0a

0x24 0x3b 0x45 0xd8 0xab 0xf5 0x09 0xa6 0x90
0x00
0xe9

Card -> STB。回复解析CW的密钥。其中0x24 0x3b 0x45 0xd8 0xab 0xf5 0x09 0xa6是解析CW的密钥。

0x00
0x00
0x49

0x80
0xea 0x80*0x00 0x16 0x00 0x00 0x3f
0x90
0x03 0x00 0x00 0x1c 0x85 0xa2 0x85
0x8b 0x1e 0x88 0x43 0x22 0x8b 0xc9 0x6a
0xc4 0x50 0x5c 0xf4 0x1c 0xfc 0xb8 0xc6
0x63 0xe2 0x2b 0x95 0xe9 0xe8 0x8e 0xe2
0x17 0xcf 0x93 0x07 0xa9 0xdc 0x28 0x52
0x2e 0xca 0x21 0xc1 0x3c 0xaf 0x76 0x78
0x82 0x50 0x24 0x97 0xfe 0x81 0xdb 0x2a
0x28 0xb1 0x0b 0xbd 0xd1 0x2a 0x13 0x01 0x00
0xf0

STB -> Card。ECM。共77字节。

0x00
0x00
0x13

0x72 0x7f 0xca 0xfa 0xce 0x53 0x21 0xd2 0xb8 0x4f 0xaa 0x9b 0x3f 0xa8 0xc5 0xbc 0xe7
0x90
0x00
0x1f

Card -> STB。CW。其中0x7f 0xca 0xfa 0xce 0x53 0x21 0xd2 0xb8 0x4f 0xaa 0x9b 0x3f 0xa8 0xc5 0xbc 0xe7是CW的关键信息。这里还需要大家要着重注意的一点是:这16个字节是直接从智能卡里读出来的,但并不是直接用来解节目的。这16个字节,分为两部分,前8个字节和后8个字节,这两部分的8个字节分别与CW的密钥的8个字节异或之后才是真正用来解节目的信息。这是BJST与YXTF、SMSX不同的地方。具体程序为

for(i=0; i<16; i++)

tempcw=response[i+1]^difor[i%8];

response[16] 是指0x72 0x7f 0xca 0xfa 0xce 0x53 0x21 0xd2 0xb8 0x4f 0xaa 0x9b 0x3f 0xa8 0xc5 0xbc 0xe7,difor[8]是密钥0x24 0x3b 0x45 0xd8 0xab 0xf5 0x09 0xa6,tempcw[16]是真正用来解节目的信息。

程序设计者在设计程序时,无论是机顶盒还是智能卡无线小板上的单片机智能卡接口接收数据,都要设计成首先接收前三个字节,根据第三个字节再决定后面还有接收多少字节。

七、 破解机卡配对
所谓的机卡配对是指特定的某一张智能卡配上与之配对的一台机顶盒才能解节目。有部分YXTF智能卡使用了这项技术,为GX带来了麻烦。其实,只要知道了机卡配对的原理,要破解它也很容易。

在初始化YXTF智能卡时,如果命令0x80 0x4c 0x00 0x00 0x040 xff 0xff 0xff 0xff后智能卡的回复是0x94 0xb2,说明这张智能卡是需要机卡配对的。如果没有给卡发送配对命令0x80 0x4c 0x00 0x00 0x04 0x5e 0xe4 0x82 0xf2,或者配对信息0x5e 0xe4 0x82 0xf2不对(每张卡的配对信息都不一样),机顶盒在解需要机卡配对的节目时,解节目就会失败。所以破解机卡配对的关键就在于给卡发送一个正确的机卡配对信息。在无线GX网络中,作为子机的原装机顶盒有机卡配对信息,但是母机没有,这就需要母机事先“学习”子机的配对信息,下次母机开机是就不用再获取子机的配对信息了。所谓母机的“学习”智能卡配对信息,就是在母机程序中加上一个功能:当子机将配对信息发给母机时,母机识别出此命令是配对命令(开命令的开头是否是0x80 0x4c 0x00 0x00 0x04),母机就把0x80 0x4c 0x00 0x00 0x04后的四个字节写到自己的FLASH中的一个文件yxtfkey.txt。等到下次开机时,母机从yxtfkey.txt读出配对信息的四个字节去跟对应的智能卡配对。如果配对成功,智能卡就认为母机是与之配对的机顶盒,当收到需要机卡配对节目的ECM时,就会非常“顺从”将正确的CW送出。所以,对于存在机卡配对的情况,只需对插卡的那台机器(母机)做机卡配对。插卡的机器完成配对后,其所带的所有无线网络、局域网或广域网的分机都不需要再做这个对应工作。如果母机没有配对成功,母机需要下一次“学习”。

八、 关键技术
在无线GX系统中,比较关键的技术有以下几点:

第一,
智能卡无线小板单片机定时器的时间设定。不同的机顶盒,智能卡的时钟频率是不一样的,所以智能卡通信的波特率也不一样。具体频率是多少需要用示-波-器测量,然后计算出智能卡通信每位所占用的时间,从而进一步设定定时器的时间。如果机顶盒与智能卡还是不能顺利的通信,需要用示-波-器对比读真卡时数据的波形,调整定时器时间,让智能卡无线小板DATA脚的波形模仿真卡的波形。根据调试的经验,一般情况,只要智能卡发送数据能被机顶盒正确接收,智能卡接收数据就没有问题。

第二,
缩短使用T0通信协议智能卡的子机ECM和CW之间的时间间隔。机顶盒每次换台时,如果换的新节目是加扰的,要向智能卡发送新的ECM。如果ECM和CW之间的时间间隔太长,换台的时间间隔也很长,影响收看节目的质量。

以 YXTF无线GX为例,母机从发送ECM到CW的过程是:机顶盒发送ECM->智能卡解析ECM->智能卡回复0x61 0x2b->机顶盒发送0x00 0xc0 0x00 0x00 0x2b->智能卡回复CW。子机的这个过程可以是:机顶盒发送ECM->仿真智能卡回复0x61 0x2b->机顶盒发送0x00 0xc0 0x00 0x00 0x2b->无线发送ECM->母机解析出CW并将CW无线发给子机->仿真智能卡回复CW。但是“无线发送ECM”和“母机解析出 CW并将CW无线发给子机”包含无线传输和母机与真正智能卡对话这两个过程,需要消耗约0.5s的时间,换台时间比较长。我们可以统筹一下,一旦得到 ECM后就立刻无线发给母机,所以可以是:机顶盒发送ECM->仿真智能卡回复0x61 0x2b->无线发送ECM ->机顶盒发送0x00 0xc0 0x00 0x00 0x2b ->母机解析出CW并将CW无线发给子机->仿真智能卡回复CW。但是根据调试经验,这样也有一个问题,无线发送ECM是一个连续的过程,大约需要消耗67ms,而机顶盒在收到0x61 0x2b后约50ms后就发出0x00 0xc0 0x00 0x00 0x2b。价格低廉的8位51核的单片机程序运行是实时单任务,也就是说单片机由于无线发送ECM而错过了接收0x00 0xc0 0x00 0x00 0x2b,当然也就没有回复过程字节0xc0,“聪明”一些的机顶盒会在3s之后重新发送0x00 0xc0 0x00 0x00 0x2b,这时单片机才会把过程字节0xc0和CW回复给机顶盒,这样的话换台时间将会变成恐怖的3s以上。没有重发功能的机顶盒就认为没有接收到CW,导致解节目失败。所以我们要相办法延迟机顶盒发送0x00 0xc0 0x00 0x00 0x2b,为此,我们可以按照以下流程设计:

总之一个原则是尽早把ECM发给母机,让母机处理ECM与子机机顶盒和仿真智能卡的对话过程同时进行,等接收到了正确的CW,并且收到了子机发送的命令0x00 0xc0 0x00 0x00 0x2b ,立刻将CW发给子机。

第三,对于T0协议的智能卡,因为子机从发送ECM到得到CW包含了母机访问真正智能卡的过程,所以缩短母机访问真正智能卡这个过程的时间才是缩短子机换台时间的根本。母机访问真正智能卡时间的长短可以通过调整母机机顶盒的程序来调整

(机顶盒)智能卡通信协议破解智能卡的基础知识相关推荐

  1. IC卡(智能卡)基础知识简介

    目录 IC卡(智能卡)基础知识简介 1.何为IC卡(智能卡) 2.IC卡的相关规范 3.智能卡如何管理其存储器 4.智能卡如何对信息存取过程进行控制 IC卡(智能卡)基础知识简介 IC卡(智能卡)基础 ...

  2. 通信协议原理及应用CAN基础知识

    通信协议原理及应用&CAN基础知识 通信协议原理及应用 通信分类 数据传输方式 串行通信 并行通信 接收端&发送端时钟频率的异同 同步通信 异步通信 通信双方的分工和信号传输方向 单工 ...

  3. Java基础知识(一),打好基础才能写出高质量代码

    前沿:不管工作多久,基础永远是最重要的,好多大厂看的就是基础好不好,所以写代码的同时,基础知识还是要去理解和记忆的,坚持每天来看一点 Java基础.语法: java面向对象的特征有哪些方面? 1.抽象 ...

  4. 嵌入式硬件基础知识汇总<附带与硬件密切相关的软件介绍>

    嵌入式硬件基础 1,存储器 1.1 概念 1.2,存储器结构模型 1.3,存储器性能指标 1.4,嵌入式存储器类型 1.4.1,只读存储器 1.4.2,随机存储器 1.4.3,双端口RAM 1.4.4 ...

  5. 软件测试入门基础知识汇总

    第一部分:软件评测知识 1.  软件质量与软件测试 软件测试:在规定条件下对程序进行操作,以发现错误,对软件质量进行评估,包括对软件形成过程的文档.数据以及程序进行测试 软件质量:软件特性的总和,软件 ...

  6. 软件测试基础知识总结(一)

    第一部分:软件评测知识 1.  软件质量与软件测试 软件测试:在规定条件下对程序进行操作,以发现错误,对软件质量进行评估,包括对软件形成过程的文档.数据以及程序进行测试 软件质量:软件特性的总和,软件 ...

  7. 自学网络安全,你需要知道的基础知识

    篇幅较长,建议收藏起来慢慢看 博客地址:http://t.csdn.cn/mSccL 一.信息安全概述 1.信息与信息安全 信息与信息技术 信息奠基人:香农:信息是用来消除随机不确定性的东西 信息的定 ...

  8. ***入门基础知识(超全)

    ***入门基础知识(超全) [sell=2]  DOS 常用命令: dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 de ...

  9. [Windows驱动开发](二)基础知识——数据结构

    本节主要介绍驱动开发的一些基础知识. 1. 驱动程序的基本组成 1.1. 最经常见到的数据结构 a. DRIVER_OBJECT驱动对象 [cpp] view plaincopy // WDK中对驱动 ...

最新文章

  1. 网页失去焦点事件 visibilitychange
  2. 清华博士宅家太无聊,给猫咪讲函数
  3. pc端,自适应屏幕分辨率
  4. oracle撤销管理的方法,Oracle9i中利用自动撤销管理的优点
  5. k8s架构组件功能介绍
  6. 第23天:指导与管理项目工作和4种合同的区别
  7. hdu 1233 最小生成树
  8. 带你认识传统语音识别技术
  9. 一个程序掌握C++带参构造函数、带有默认参数的构造函数【C++类的经典使用案例】
  10. Eclipse ADT 使用空格替代Tab键缩进整块整块代码
  11. ALEIYE 2.0发布 首创RET关键事件功能
  12. tbb::atomic和std::atomic的区别 废弃
  13. 5G时代下的移动边缘计算(MEC)探索系列之一
  14. 玉林师范学院计算机宿舍专业,玉林师范学院宿舍怎么样 住宿条件好不好
  15. MathType工具栏在word里无法点击
  16. 庄懂技术美术入门课笔记_L13_特效类shader(AlphaBlendAlphaCutoutAdditice)
  17. 3D游戏编程与设计4——游戏对象与图形基础
  18. 医学图像处理(三)ABIDE数据集下载
  19. 数据库(mysql)之事务和存储引擎
  20. Python-OpenCV——Image Blurring(Image Smoothing)

热门文章

  1. 什么是值传递,什么是引用传递
  2. oracle 11g安装过程中问题:移动bin\oralbac11.dll 到bin\oralbac11.dll.dbl出错
  3. poi3.17导出excel添加附件解决办法
  4. 流利阅读 2019.2.23 China’s Forbidden City opens to the general public at night for the first time in 94
  5. 爬虫速成(四):数据存储
  6. HNOI2008玩具装箱(T_OY)bzoj1010
  7. linux内核编译最详细,Linux内核编译详细教程,linux内核编译
  8. STM32C8T6 CAN常见波特率配置表
  9. C# Winfrom 常用功能整合-1
  10. 欧氏距离详解及在matlab中的实现