某科学的一卡一密破解

0x0 前言

寒假的时候闲的没事干买了一个pn532的模块,把自己的水卡破解了,并在开学后成功解析了余额.但是仅仅这样还不足以满足我的好奇心,因为只要换一张卡片就又需要使用mfcuk强行爆破密钥,时间成本太高了,而且还有一些批次的卡属于无漏洞卡,不能使用darkside攻击掏出密钥来.

这哪能忍?我随即萌生了破解该系统一卡一密算法的想法.

在开学的首个星期我和朋友收集了大量卡号和卡密的对应关系.在周末放假的时候由我基于平时观察到的一些规律对该算法进行了猜测.

注意!这篇文章只供学习研究之用,相关卡片均已复原,对于学习以及模仿这些操作所造成的一切后果与本人无关.

0x1 初探 看表面现象

这部分主要由我的一位朋友观察得出,这些规律在后续的破解中起到了至关重要的作用.

该系统卡片uid为4字节,Keya=Keyb=6字节密钥 ,经过验证,可知Keyab只与uid有关.

如下是部分数据,篇幅所限不多放了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
AE 11 A0 32			#UID
D6 94 AF 74 AE 39 #Key

FE F1 97 2A
87 13 74 2C 56 5E

F8 EA 87 63
E1 1E 9E 7A 04 48

3E FC D3 31
35 9A F0 1A 40 DA

3E 6E 88 1B
24 53 27 BE F8 81

8E 80 98 1B
06 1D C7 AC 16 21


--------------- 图例 -------------
A B C D
a b c d e f

注:A-D a-f均为uint8

从我们能获取到的若干数据由观察得出:

  1. UID下半字节总是0xE
  2. D绝绝绝绝大多数属于32 2A 31 1B 63 中的一种.
  3. C的下半字节与c下半字节存在对应关系 即图例中C与c的半对应关系
  4. C的下半字节与f下半字节存在对应关系 即图例中C与f的半对应关系
  5. e下半字节和B的下半字节也存在对应关系,但是对应关系表和D的取值有关.
  6. d下半字节和B的下半字节也存在对应关系,但是对应关系表和D的取值有关.

0x2 再探 从现象到本质

上文提到的对应关系表存在明显的异或特征,因此由异或入手.

入手点是Cc以及Cf的关系.因为他们的规律比较简单.

因为c 和 f 的尾数和C有对应关系,但是上半字节就显得没有那么直观了.结合A的尾数不变恒为0xE,推测尾数呈现和C的对应关系可能是由于A参与了运算(因为A尾数为定值,相当于一个常数).

经过尝试,推得c 和 f的算法如下:

1
2
c = ((A+C)^0xe1) & 0xff
f = (A^C^0x37) & 0xff

按位与0xff的作用是消除进位.例如0x1e1 & 0xff = 0xe1

0x3 再再探 再接再厉

按照类似的思路,因为5 6条规律显示e d和B与D有关,按照前面的思路不难找出

1
2
e = (B^D^0x8d) & 0xff
d = ((B+D)^0x37) & 0xff

目前还剩两个字节即a b 没有破解,到这里观察出来的规律就用完了,开始按照他的常用思路试:

发现B^C^b 下半字节恒定.参考前面我们的思路,推测下半字节恒定是因为A参与了运算.

找出

1
b = (A^B^C^0x8b) & 0xff

a的算法没什么好说的,到这一步了就开始各种试,最后推得

1
a = ((B+C+D)^0x35) & 0xff

0x4 C代码实现

没什么好说的,贴个代码,方便复制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void key_from_uid(uint8_t *uid,uint8_t *key)
{
uint8_t A=uid[0];
uint8_t B=uid[1];
uint8_t C=uid[2];
uint8_t D=uid[3];

key[0]=((B+C+D)^0x35)&0xff; //a
key[1]=(A^B^C^0x8b)&0xff; //b
key[2]=((A+C)^0xe1)&0xff; //c
key[3]=((B+D)^0x37)&0xff; //d
key[4]=(B^D^0x8d)&0xff; //e
key[5]=(A^C^0x37)&0xff; //f
}

0x5 总结

别看我说的这么轻巧,实际上找出这个算法可以说是非常累人的,从我意识到 cf可能是A参与计算到全部推出也花了一个多小时来不停尝试.更不算前期收集数据和观察-总结数据所耗费的精力.再次感谢对本次实验提供支持的赵某,没有细致的观察得到的规律是不可能猜出这些算法的.

这一次是我第一次尝试破解ic卡的算法.在这之前我连异或等位运算都不算熟悉,这次咱算是学到了很多东西,好在最后总算不负众望把整个密钥算法猜出来了.

还有,新的一年总算水了一篇博客,2333

misakabk

最后放一张御坂妹(ᗜ_ᗜ)


某科学的一卡一密破解
https://www.hakurei.org.cn/2024/03/10/toaru-kagaku-no-one-card-one-key-crack/
作者
zjkimin
发布于
2024年3月10日
更新于
2024年3月16日
许可协议