|
IC电话卡彻底解密 --------------------------------------------------------------------------------
声明:本资料仅从技术的角度全面探讨IC卡、IC电话卡及其安全性,由此引发的各种争议或个人、集体利用本资料做任何不正当用途本人概不负责。
--------------------------------------------------------------------------------
目录 Ⅰ)第一类卡(德国、西班牙、中国、香港、澳门等) Ⅰ-1)介绍: Ⅰ-2)引脚: Ⅰ-3)主要特性: Ⅰ-4)时序图: Ⅰ-5)内存数据: Ⅱ)第二类卡(法国、墨西哥、捷克、瑞典、爱尔兰等) Ⅱ-1)介绍: Ⅱ-2)引脚: Ⅱ-3)主要特性: Ⅱ-4)时序图: Ⅱ-5)内存数据: Ⅱ-6)电气参数: Ⅰ) 第一类卡 Ⅰ-1)介绍 自从80年代中期出现IC电话卡后,基本已取代了原来流行的电话磁卡,磁卡存在存在严重的安全问题,已逐步淘汰。 即使IC电话卡,也不能算很安全,卡内所有数据只要有简单的读写装置并按时序操作都能读取,事实上电话卡和信用卡一样内部没有什么秘密信息,仅仅是带串行输出的128位EPROM而已(对二类卡是256位PROM),不要以为弄懂了它是怎么工作你就有办法重新对卡内数据重新填充,其开始的64位是带写保护的,在出厂时其熔丝位已被编程,你已无法对其更改,其后的40位计数单元受内部逻辑控制在写时只能减少不能增加直至到0为止,因此你想用一般的IC电话卡打免费电话是不可能的,除非你能用单片机仿真它(如果你能读懂本文介绍的所有内容)。IC电话卡是一种一次性使用的计数卡,以一次性的计数方式,从写满的计数器中减“1”,直至存储单元减为空为止。 卡片每次消费计数的“单位价值”根据各种应用系统的实际需要而定。例如:对于中国IC电话卡,如30元卡对应内部计数值为300,每单位值对应0.1元,IC 卡电话机每分钟产生一次扣费信号,扣费值由当地IC电话管理系统设定,一般是价值0.5元或1元,卡片被计数5次和10次。对于其它国家属于第一类IC电话卡而言也是如此,只是内部初始计数值不同,每次扣除额度不一样罢了。其他对于公用加油卡,IC卡计费加油机每一公升(或一加仑)产生一次扣费操作,卡片被操作一次扣2.5元等等,均属于等同原理。事实上,这类卡内部为128位(16字节) NMOS存储器,按如下规律分布:
64 位 EPPOM(8字节) 写保护区(芯片数据代码区、发行数据代码区) 40 位 EEPROM(5字节) 24 位 为全“1”(3字节) 共16字节数据。 Ⅰ-2)引脚: -------------+------------- | 1 | 5 | 引 脚: | | | ------- +-------\ | /-------+ | 2 +----+ + 6 | 1 : Vcc = 5V 5 : Gnd | | | | 2 : Reset 6 : NC +--------| |--------+ 3 : Clock 7 : I/O | 3 | | 7 | 4 : NC 8 : NC | +----+----+ | +-------/ | \-------+ Vcc:电源 Gnd:地脚 Reset:复位 | 4 | 8 | | | | Clock:时钟 I/O:数据 NC: 空脚 -------------+------------- 因有三个脚为空脚,目前一般有采用8脚和6脚封装的,6脚封装的无最下一排两个空脚
Ⅰ-3)主要特性: -采用单一5V电源供电 -遵循ISO/IEC7816-3同步协议进行双向数据传输 -低功耗 -NMOS技术 -高可靠性,抗静电干扰能力>4KV
Ⅰ-4)时序图 复位: 为使地址计数器复位到0,先让Reset端变高。紧跟着一个Clock脉冲(从低到高再降到0),Reset重新变低,把Clock脉冲包住。随着Reset端变低,地址0单元的数据从I/O上输出。对应 Clock端的每个脉冲,其上升沿使地址计数器增加。其下降沿使被选通地址单元的数据从I/O上输出。地址计数器增加到127后返回到0。
__________________ _____| |_____________________________________________ Reset : : : _____ : _____ _____ _____ _____ _____:_______| |____:_| |_____| |_____| |_____| |_ Clk : : : : : : : : : : : _____:_______:__________:_:_____:_____:_____:_____:_____:_____:_____:_ _____:___n___|_____0____:_|_____1_____|_____2_____|_____3_____|___4_:_ (Address) : : : : : : _____: :_______:___________:___________:___________:_ _____XXXXXXXXXXXXXXXXXXXX_______|___________|___________|___________|_ Data Bit n Bit 0 Bit 1 Bit2 Bit3 写位: 在Reset和Clk端均为低的情况下,如果某地址单元允许写操作(64-103位,且该位必需为1),则Reset端上的一个脉冲(即从低到高再回低)将允许芯片进行位写操作。在紧跟着的时钟脉冲期间执行写操作,调整写操作维持时间至少10ms,在这个CLK脉冲期间,地址计数器不会增加,在CLK写脉冲下降沿,数据0从I/O端输出。从Reset脉冲的上升沿到CLK写脉冲的下降沿期间,I/O端的数据是无效的。在下一个才CLK脉冲,且Reset为低时,地址计数器又增1,并在下降沿时,把选通的地址单元的数据送到I/O端。
_____ _____ _____________| |______________________________| |_______________ Reset : : ___ : _____ ___ : _____ ____| |____:__________| |_________| |_____:__________| |____ Clk : : : : : : : : : ____:________:__________:_____:_________:___:_____:__________:_____:_____ n | n+1 | n+2 | : n+3 | : (Address) ----'--------:----------'-----:---------'---:-----:----------'-----:----- : : : : : : : _________ _: : : ____________: ___: : : _________XXX_XXXXXXXXXXXXXXXXXXX____________ XX___XXXXXXXXXXXXXXXXXXXXXXX I/O n n+1 : : n+1 n+2 : : : : : : write write 借位写后的字节擦除: 对位地址72-103的字节单元来说,只要在每个字节的前面一位进行一次正常的写操作,就可以对此字节后一字节进行字节擦除操作。也就是说,每向高一字节进行借位(即写一位0),紧接着的擦除时序可以对后一字节按字节擦除(即整个字节写1)。被擦除的字节总是比借位写的字节低一字节。从以下时序图可以看出,首先,完成一个“位写”操作,在CLK的写脉冲结束后,在CLK为低电平时,在发一个Reset脉冲即启动字节擦除操作。在第二个CLK脉冲完成字节擦除,脉冲维持时间整定为擦除周期时间(至少1ms)。芯片逻辑控制电路验证了借位写确已完成从“1”写“0”后,才擦除其低位字节。从Reset的上升沿到擦除操作的CLK脉冲的下降沿,I/O脚上的数据无效。地址计数器仍然停留在借位写的地址上。
_____ _____ ______| |____________________| |_________________________________ Rst : : : _______ : _______ ___ ______:___________| |______:_____________| |______| |______ Clk : : : : : : : : : : : : : : : : <------------------------- address n ------------------------>:<--- n+1 ------ : : : : : : : : : : : : : : ______: : :______: : :__________: _____ ______XXXXXXXXXXXXXXXXXXXXX______XXXXXXXXXXXXXXXXXXXXXXX__________XX_____ I/O : : n : : n n+1 : : : : Write Erase 计数方法: 在67-103地址单元中分为5个不可重置8单元计数器,芯片初始化时,72-103地址单元所对应的4个较低的8单元计数器中可以放0到8个“1”而67-71地址单元所对应的第5个计数器可以放0到5个“1”。所谓计数一次,就是将一个单元从“1”写成“0”。一个计数器中8位全为“0”后,要计数,需借位操作,即将高位计数器的一位从“1”写成“0”而相应其低位计数器整个字节从“0”擦除成“1”。可见4个8单元计数器如此逐一递减,其最大计数为8的4次方=4096。第5个计数器中5个单元因处在最高位只能被写“0”无法擦成“1”。因此只能计数5次。故芯片总计数为5X4096=20480。当全部计数单元(地址67-103)都被写成“0”时,卡片就用完了,不过,芯片出厂初始化时,初置的计数值由国家不同和卡片面值不同而不同,如100元卡初置计数值为1000。
举例: 100元(1000计数单元预置初始值). --------
Byte9 Byte10 Byte11 Byte12 Byte13 -------------------------------------------------------------- 000000 - 00000001 - 01111111 - 00011111 - 00000000 -------------------------------------------------------------- (3)octal (6)octal (7)octal (1)octal (2)octal -------------------------------------------------------------- Value = 0*8^4 + 1*8^3 + 7*8^2 + 5*8^1 + 0*8^ -------------------------------------------------------------- 总值 = 1000 Units Ⅰ-5)内存数据: 字节 位 二进制 十六进制 +-----------+-----+ 1 1 --> 8 | | | +-----------+-----+ 2 9 --> 16 | 0010 1111 | $2F | ---> 德国 | 0011 0111 | $37 | ---> 西班牙 | 0011 1011 | $3B | ---> 希腊 +-----------+-----+ 3 17 --> 24 | | | 4 25 --> 32 | | | ---> 出厂编号(写保护) 5 33 --> 40 | | | 6 41 --> 48 | | | 7 49 --> 56 | | | 8 57 --> 64 | | | +-----------+-----+ 9 65 --> 72 | | | ---> c4096 ) 10 73 --> 80 | | | ---> c512 ) 11 81 --> 88 | | | ---> c64 ) 5个8进制计数区 12 89 --> 96 | | | ---> c8 ) 13 97 --> 104 | | | ---> c0 ) +-----------+-----+ 14 105 --> 112 | 1111 1111 | $FF | 15 113 --> 120 | 1111 1111 | $FF | ---> 所有位都为"1" 16 120 --> 128 | 1111 1111 | $FF | +-----------+-----+ 如需某一国家卡内数据详细数据请与作者联系。
Ⅱ)第二类卡 Ⅱ-1)介绍: 二类卡与一类卡的区别在于,二类卡为256位PROM卡,在计数方式上有区别,一类卡5个计数单元组成5位8进制递减计数单元,有较大的计数范围,而二类卡的计数单元每一位只能计数一次,在写为“1”后该位即无效,另外在引脚设置、操作时序上也不相同。
Ⅱ-2)引脚: -------------+------------- | 1 | 5 | | | | +-------\ | /-------+ | 2 +----+ + 6 | | | | | +--------| |--------+ | 3 | | 7 | | +----+----+ | +-------/ | \-------+ | 4 | 8 | | | | -------------+-------------
1 : Vcc = 5V 5 : Gnd 2 : R/W 6 : Vpp = 21V 3 : Clock 7 : I/O 4 : Reset 8 : Fuse 1:电源脚 2:读写控制 3:时钟 4:复位 5:接地 6:熔丝电压 7:输入输出 8:熔丝控制
Ⅱ-3)主要特性: -同步传输协议 -N-MOS技术 -256X1位 -96位带写保护 -低功率85mW -21V熔丝电压 -响应时间:500ns -10年以上数据保持
Ⅱ-4)时序图: +21V _____________ +5V ____________________________________| |_________________ Vpp : : +5V ___________________:_____________:_________________ Reset 0V ________________| : : : : : +5V ____ : ____ : ______:______ 0V ___| |_______:_____| |________:______| : |__________ Clock : : : : : : : : : +5V : : : : : :______:______: : _ 0V ___:____:_______:_____:____:________| : |______:__________ R/W : : : : : : : : : +5V : : :_____: :________: : : :__________ 0V XXXXXXXXXXXXXXXXX_____XXXXXX________XXXXXXXXXXXXXXXXXXXXXX__________ Out : : : : : :<-----><---->: : : : : : : :10 to 10 to : : : : : : :50 ms 50ms : 卡复位 Bit 1 Bit2 Bit 3 读 读 Bit2 写为1 读 -5)内存数据: 法国和摩洛哥等:
字节 位 进制 十六进制 +-----------+-----+ 1 1 --> 8 | | | +-----------+-----+ 2 9 --> 16 | 0000 0011 | $03 | ---> 法国卡 +-----------+-----+ 3 17 --> 24 | | | +-----------+-----+ 4 25 --> 32 | | | +-----------+-----+ 5 33 --> 40 | | | +-----------+-----+ 6 41 --> 48 | | | +-----------+-----+ 7 49 --> 56 | | | +-----------+-----+ 8 57 --> 64 | | | +-----------+-----+ 9 65 --> 72 | | | +-----------+-----+ 10 73 --> 80 | | | +-----------+-----+ 11 81 --> 88 | | | +-----------+-----+ 12 33 --> 40 | 0001 0011 | $13 | ---> 120 units card | 0000 0110 | $06 | ---> 50 units card | 0000 0101 | $05 | ---> 40 units card +-----------+-----+ 13-31 97 --> 248 | | | ---> 计数单元区: 每消耗一单位,该位被写 | | | 为“1”,一般开始10为为工厂作熔丝 | | | 测试写为“1” | | | | | | | | | | | | +-----------+-----+ 32 249 --> 256 | 1111 1111 | $FF | ---> 空卡指示 +-----------+-----+ 其它国家: 字节 位 进制 十六进制
+-----------+-----+ 1 1 --> 8 | | | +-----------+-----+ 2 9 --> 16 | 1000 0011 | $83 | ---> 电话卡标记 +-----------+-----+-----------+-----+ 3-4 17 --> 32 | 1000 0000 | $80 | 0001 0010 | $12 | ---> 10 元 卡 | | | 0010 0100 | $24 | ---> 22 元 卡 | | | 0010 0111 | $27 | ---> 25 元 卡 | | | 0011 0010 | $32 | ---> 30 元 卡 | | | 0101 0010 | $52 | ---> 50 元 卡 | | | 0110 0010 | $62 | ---> 60 元 卡 | | | 1000 0010 | $82 | ---> 80 元 卡 | 1000 0001 | $81 | 0000 0010 | $02 | ---> 100 元 卡 | | | 0010 0010 | $22 | ---> 120 元 卡 | | | 0101 0010 | $52 | ---> 150 元 卡 +-----------+-----+-----------+-----+ 5 33 --> 40 | | | ---> $00 for sweden. +-----------+-----+ 6 41 --> 48 | | | +-----------+-----+ 7 49 --> 56 | | | +-----------+-----+ 8 57 --> 64 | | | +-----------+-----+ 9 65 --> 72 | | | +-----------+-----+ 10 73 --> 80 | | | +-----------+-----+ 11 81 --> 88 | | | ---> $11 为瑞典 +-----------+-----+ 12 89 --> 96 | 0001 1110 | $1E | ---> 瑞典 | 0011 0000 | $30 | ---> 挪威 | 0011 0011 | $33 | ---> 安道尔 | 0011 1100 | $3C | ---> 爱尔兰 | 0100 0111 | $47 | ---> 葡萄牙 | 0101 0101 | $55 | ---> 捷克 | 0101 1111 | $5F | ---> 加蓬 | 0110 0101 | $65 | ---> 芬兰 +-----------+-----+ 13-31 97 --> 248 | | | ---> 计数单元区: 每消耗一单位,该位被写 | | | 为“1”,一般开始2为为工厂作熔丝 | | | 测试写为“1” 。 | | | | | | | | | | | | +-----------+-----+ 32 249 --> 256 | 0000 0000 | $00 | +-----------+-----+
|