← 返回首页

信用卡芯片里的秘密

发布时间: 2026-04-09 13:57(北京时间)

摘要: 作者通过接触式读卡器解析过期信用卡的芯片数据,详细描述了TLV编码的解析过程,包括Tag、Length和Value的识别规则,以及Primitive与Constructed数据类型的判断。内容涉及发卡国家代号等具体信息,并指出CVV不存储在芯片中以确保安全,最后提及生成随机数的实验。整体语调冷静、技术性强,聚焦于编码逻辑与数据安全。

标签: 信用卡芯片, TLV编码, 数据解析, 技术笔记, 安全机制, 冷静, 结构化思考, 实验记录

字数: 1249

原文链接: /7402396589/QzZOqtOIq

记录一下笔记:

接触式的读卡器先到了,型号是 ACR39U-U1,不过芯片白卡不管是4442/4428还是J3R200都还没到。只好掏出一张过期信用卡玩玩。

SFI:1找到1条记录,SFI:2找到2条记录。

拿到原始数据之后,解析过程就非常有意思了。遵循TLV编码方式,也就是 Tag-Length-Value 的顺序。

比方说,我读出来的原始数据中有一段是“5F28020156”,拆成 Tag-Length-Value 的形式就是:Tag:5F28, Length:02, Value:0156

那为什么Tag就一定是5F28,不能是5F或是5F2802吗?
这里的设计很巧妙。每读到一个Tag的字节,就会判断这个字节的低5位是不是“全是1”,如果“全是1”,那么说明Tag还没读完。

比如5F的二进制是 010 11111,低5位全是1,所以还得继续读下一个字节。
28的二进制是 001 01000,低5位不全是1,说明tag已经结束了。所以Tag就一定是5F28。

解决完Tag后还有个问题,Tag有两种数据类型,一种是Primitive的,代表Value就是一个数值,一种是Constructed的,代表Value里面还套了其他的TLV结构。

这个判断起来也很巧妙,看的就是Tag的第一个字节的第6位。
5F的二进制是 0101 1111,第6位是0,说明Value是Primitive。

关于Tag解析的问题都解决完后,我们来看看Length。在这个例子里的Length是02,假如这个tag的数据Length超过255怎么办?

Length也有自己的规矩,读到Length第一个字节后看最高位(第8位),如果最高位是0,那么说明长度在127以内,剩下的7bit就是Length。如果最高位是1,那么剩下的7位代表后面还有几个字节是Length。

举个例子,Length: 82 01 2C
82的二进制是 10000010 ,最高位是1,剩下的7bit是10,也就是十进制的2,说明在82后面的2个字节都用来代表长度。所以长度就是012C(300个字节)。

回到之前“5F28020156”的例子,所以这部分表达的就是 Tag 5F28 的值是 0156。
↑那这是什么意思呢?需要去搜索“emvtags”找到5F28的意义(图1)。

查了以后知道,5F28就是发卡国家代号,遵循 ISO 3166 标准。查 ISO 3166-1 numeric 可知,156代表的就是中国。

按照上面提到的TLV编码规范以及emvtags列表,我们可以比较轻松地把原始数据解析成key:value的形式,能看到这张信用卡的很多信息。

卡号、持卡人姓名、失效日期等都有,但CVV是绝对不储存在卡里的,这是为了资金安全。

读完这些卡片信息,我还在应用内尝试发了 0x00, 0x84, 0x00, 0x00, 0x08 给卡片,它吐出了8个字节的随机数w

image