CPU卡调试与发卡总结

CPU卡调试与发卡总结 2024.12.27

=============================================================

说明CPU卡的缺陷:CPU卡读取时,认证失败4次,会被锁卡。

=============================================================

1、 CPU卡的操作步骤:寻卡-防冲突-选卡-ATS,前面三步和M1操作完全一样,属于ISO14443A前面三层的操作,ATS成功后就进入ISO14443A-4协议层了,也就进入了CPU卡的操作层

2、 PPS是可以不做的,只有RATS的返回值表明其接收能力大于PCD的发送即可。PPS用来设置通信时的波特率,通过RATS命令响应数据07 77 80 A0 02 47 56可以判断该卡仅支持106K波特率。所以PCD也没有通过PPS指令修改通信波特率的必要了。当然PPS指令重新按106K波特率设置一下也是可以 的,RATS以及后续的PCD指令都需要加上CRC的。

3、 ISO14443-4只规定到PPS指令,后续的指令都需要由CPU卡内部的软件COS来解释,所以卡片完成SELECT,通过RATS和PPS指令后,必须发COS支持的指令。发COS支持的指令一般都需要加CRC的。

4、 发送取随机数命令00 84 00 00 04,根据块格式规定,除了发送这个指令外,还要发送PCB和CID,即实际发送的字符是0A 01 00 84 00 00 04,0A01这两个字节必须加在每个指令字符串的前面,并且块号不能重复,即如果你连续2次取随机数,需如下发送:0A 01 00 84 00 00 04 ,0B 01 00 84 00 00 04.即第一个字节的最后一位要不断变化。

5、 取随机数命令可取4字节或8字节。若取随机数命令下条指令为外部认证,则外部认证数据用指定的外部认证密钥解密后与该随机数进行比较。外部认证命令要求 CPU卡存在用于外部认证的密钥。在满足该密钥的使用条件,且该密钥未被锁死时才能执行此命令。将命令中的数据用指定外部认证密钥解密,然后与先前产生的 随机数进行比较,若一致则表示认证通过,置安全状态寄存器为该密钥规定的后续状态值,错误计数器恢复成初始值,若比较不一致则认证失败,可再试错误数减 一,且不改变安全状态寄存器的值。

6、 MF文件唯一存在,CPU卡复位后,卡片自动选择MF文件为当前文件。任何一个DF在物理上和逻辑上都保持独立,都有自己的安全机制和应用数据。可以通过 应用选择实现对其逻辑结构的访问。可以将单个DF文件以及其中一个或多个EF文件当做一个应用。也可以将多个DF以及其中多个EF文件当作一个应用。基本 文件EF用于存放用户数据和密钥,存放用户数据的文件称为工作基本文件,在满足一定条件下用户可对文件进行相应的操作。

KEY文件称为内部基本文件,不可由外部读出,但当获得许可的权限时可在卡内进行相应的密码运算,在满足写的权限时可以修改密钥。KEY文件必须在 MF/DF下最先被建立,且一个目录只能有一个KEY文件。KEY文件可以存多个口令密钥,外部认证密钥,DES运算密钥,每个密钥为一个TLV格式的可 变长记录,记录的长度为密钥数据长度加8,3DES密钥长度为24字节,DES密钥记录的长度为16字节。

7、 外部认证

A、 取随机数可以取4字节,也可以取8字节,如果是4字节,则在后面加上4字节0,也就是参与加密运算的随机数是8字节。

B、 外部认证所用的加密算法是DES/3DES算法

C、 密钥是指外部认证密钥

D、如果密钥的长度是8字节,则适用DES算法,如果密钥长度为16字节,则适用3DES算法。

8、 一般CPU卡提供商提供CPU卡时,已经对CPU卡进行过初始化,即CPU卡上已经建立了主文件MF及主密钥文件(MF下的KEY文件),主密钥文件中也 写入了初始化CPU卡主控密钥。在对CPU卡建立特定的卡结构及写入密钥和数据之前,程序设计中的第一步应该对CPU卡进行外部认证。外部认证所使用的密 钥正是初始CPU卡主控密钥。当完成外部认证后,接下来最好是擦除CPU卡上已有的结构,然后开始重新建立CPU卡结构。

9、 文件标识符是文件的标识代码,用2个字节表示,同一目录下的文件标识符必须是唯一的,MF的文件标识符是3F00。短文件标识符选择只能用5位来决定。所 以可选择的最大文件标识符是31。选择文件后,只要文件存在,该文件就被置为当前文件,以后可以不用选择而直接对该文件进行操作。文件类型在建立文件时规 定。

10、 删除MF文件后,选择MF会返回FA 01 01,程序要一直发送FA 01 01给1208,直到收到0A 0B开头的数据。如果MF下没有密钥文件,建立KEY文件不需外部认证。

11、 在多应用卡中,MF下通常包含多个DF,这里的MF就是一个典型的DDF,为了维护管理DDF下所有的DF,在每一个DDF下一般可以包含一个系统文件(DIR),记录所有子DF的入口,如果只有一个ADF应用,不需建立DIR文件。

12、 DF文件短标识符,当高三位为000时,为DDF,当高三位为100时,为ADF的短文件标识符,在建立目录文件时,要指定2字节文件标识符,短文件标识 符,文件名。短文件标识符要在1-31之间,和文件标识符没有关系。在卡片出厂时建立MF,MF的短文件标识符应为01,因为建立MF下密钥文件使用的 DF短标识符是01。所以自建一个DF,短文件标识符应定义为02或其它值。同一目录下的文件标识符必须是唯一的。

13、 密钥标识,如果该目录下某类型密钥只有一个,则其密钥标识原则上应为00,否则应从01顺序开始。

14、 增加权限:在当前目录下创建新文件的权限

激活权限:激活失效安全机制的权限

终止权限:永久终止的权限,对于MF来说,标识卡锁定,对于ADF来说,表示当前应用永久锁定,即应用失效。

读权限:对EF文件的内容的读操作权限

写权限:对EF文件内容的写操作权限

安装权限:安装密钥和密码的权限

使用权限:表示使用密钥或密码的权限

修改权限:修改密钥或密码的权限

解锁权限:解锁密码PIN的权限,此权限只有PIN才有

15、 安全机制是指安全状态的改变所采用的方法和手段以及安全属性和安全状态之间的控制关系,COS命令在执行过程中,首先要检查COS环境所处的安全状态是否 符合执行命令需求的安全属性,假设当前COS所处的是安全状态A,执行COS命令安全属性要求为安全状态B,在执行COS命令前要通过安全机制涉及安全提 升方法,将安全状态提升到安全状态B。

16、 内部认证是用读卡设备来认证卡,保证卡的合法性,内部认证可以防止伪造的卡在读卡设备上进行操作。

外部认证是用卡来认证外部读卡设备的合法性,外部认证可以防止恶意对卡进行操作,读取或更改卡内信息。外部认证还可以改变卡的安全状态,一般卡内存 储了多个外部认证密钥,每个外部认证密钥多能改变的安全状态不一样,在进行外部认证时,必须通过密钥索引参数选择对应的外部认证密钥完成外部认证。

CPU卡和读卡设备存放吸纳沟通的密钥

外部认证步骤:

A、 CPU卡产生一个8进制随机数送给读卡器,CPU卡临时保存随机数在卡内

B、 读卡器程序用密钥计算随机数,得到随机数密文

C、 读卡器程序把8字节随机数密文送给CPU卡

D、CPU卡在卡片内部解密8字节随机数得到随机数明文

E、 CPU卡在卡片内部把解密后的随机数和步骤A中临时存放的随机数对比,若相等,则外部认证密钥成功

外部认证是CPU卡认证读卡器

内部认证步骤:

A、 读卡器产生一个8字节随机数,发送给CPU卡,读卡器临时保存这个随机数。

B、 CPU卡用内部认证密钥计算这个随机数,得到8字节随机数密文。

C、 CPU卡把随机数密文发给读卡器

D、读卡器解密8字节随机数密文得到随机数明文

E、 读卡器把解密后的随机数和步骤A中产生的随机数对比,若相等,则内部认证成功。

内部认证是读卡器认证CPU卡

执行FM1208 CPU发卡操作且不进行密钥验证,其主要流程可以简化为以下几个步骤: ### 发卡流程 #### 1. 初始化片 在开始发卡之前,需要确保片处于初始状态。如果片已经使用过,则需要先擦除片上的所有数据和文件结构。对于未初始化的片,可以直接跳过此步骤。 #### 2. 创建目录文件 创建主控目录(如`3F00`),它是整个片文件系统的根目录。接着根据需求创建应用目录(如`A000000003`)。这些目录用于组织和管理片上的各类数据文件。 #### 3. 创建用户密钥(可选) 在不进行密钥验证的情况下,这一步可以省略。但如果希望后续增加安全性,也可以在此阶段创建默认密钥或空密钥(如`FFFFFFFFFFFFFFFF`)作为占位符。 #### 4. 写入二进制数据 根据实际需求,在片中写入二进制数据文件(Binary File)。可以通过以下命令格式进行写入: ``` <- 00D6XXXXXX Len Data -> 9000 (成功) ``` 其中,`XXXXXX`表示文件标识符,`Len`是数据长度,`Data`是要写入的数据内容。 #### 5. 写入记录数据 如果需要存储结构化的记录数据,可以创建记录文件并依次写入多条记录。写入记录数据通常使用如下命令: ``` <- 00DCXXXX00 Len Data -> 9000 (成功) ``` #### 6. 完成发卡 完成上述操作后,片即可视为已发卡状态。此时可以将片交付给最终用户或设备使用。 --- ### 示例代码片段(使用APDU指令模拟发卡流程) ```python # 模拟发送APDU指令 def send_apdu(apdu): # 这里仅作为示例,实际需器通信 print(f"发送APDU: {apdu}") # 返回模拟响应 if apdu == "00A40000023F00": return "9000" elif apdu == "00E000000A0A010203040506070809": return "9000" elif apdu == "00D600010411223344": return "9000" else: return "6A80" # 创建主控目录3F00 response = send_apdu("00A40000023F00") if response != "9000": print("选择主控目录失败") # 创建应用目录A000000003 response = send_apdu("00E000000A0A010203040506070809") if response != "9000": print("创建应用目录失败") # 写入二进制数据到指定文件 response = send_apdu("00D600010411223344") if response != "9000": print("写入二进制数据失败") ``` --- ### 注意事项 - **片状态**:确保片未被锁定或损坏。 - **工具支持**:推荐使用专业的CPU开发工具或SDK(例如复旦微电子提供的工具链)进行调试。 - **兼容性**:不同厂商的片可能存在差异,建议查阅具体片的技术手册以确认命令格式和参数[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值