前言

最近这两年陆陆续续收到一些M1卡的数据,每次简单滴破解了一下之后感觉挺有意思的,但是害怕以后没过多久就忘记了,所以打算以我能看懂的形式浅浅的记录一下。

密钥算法

算法一

这是个非常非常非常简单的算法,只涉及到了异或

UID和Key的映射关系如下图:

具体算法:

u2 XOR 12 = k1
u4 XOR A5 = k2
u3 XOR 34 = k3
u4 XOR AB = k4
u2 XOR 6A = k5
u1 XOR 36 = k6

u1,u2,u3,u4分别对应UID的第一,第二,第三和第四位,k1-k6分别对应Key中的第一到第六位。

一些数据

算法二

这个算法是某个学校的水卡的密钥算法,可以说算是非常地复杂了,当时花了一个星期才破解出来。这个对应关系有点复杂,每一位的第一个和第二个数字有其单独的对应。

UID和Key的映射关系:

每一位Key的算法都有点复杂,比如

Key1

以这个为原像,建立k1的映射

映射之后如下:

这里我们设第一个数字为a,第二个数字为b,则k1的算法可表示为:

a XOR 1 = 第一位数字

(30 - b) % 16 = 第二位数字

这算是6位key中最简单的一个了。

Key2

由原像映射的像如下

算法:

如果 0 <= b < 7:

则 (20 - a) % 16 = 第一位数字

如果 7 < b < 16

则 (19 - a) % 16 = 第一位数字

b XOR 1 = 第二位数字

Key3

映射关系

算法:

如果 0 <= b < 7:

则 ((a + 1) % 16) XOR 5 = 第一位数字

如果 7 < b < 16

则 a XOR 5 = 第一位数字

(23 - b) % 16 = 第二位数字

Key4

映射关系

算法:

当0 <= a < 14时

((a + 6) % 16) XOR 3 = 第一位数字

当13 < a < 16时

((a + 5) % 16) XOR 3 = 第一位数字

((b + 3) % 16) XOR A = 第二位数字

Key5

映射关系

算法

当0 <= b < 12时

a XOR C = 第一位数字

当 11 < b < 16时

((a + 1) % 16) XOR C = 第一位数字

(20 - b) % 16 XOR 4 = 第二位数字

Key6

映射关系

算法:

a XOR 1 = 第一位数字

(30 - b)% 16 = 第二位数字

算法三

累了,有空再写