利用Excel分析IC卡校验码,另附突破金额655.35教程

简介: 我得说,这篇文章不讲怎么从卡里读出数据,不讲怎么提取有效数据,因为大家动动脑子就知道可以用acr122u pm3 之类的搞定密钥,然后找变化位确定校验位,二分法快速确定有效位,等,搞不定密钥的话我也没办法。

我得说,这篇文章不讲怎么从卡里读出数据,不讲怎么提取有效数据,因为大家动动脑子就知道可以用acr122u pm3 之类的搞定密钥,然后找变化位确定校验位,二分法快速确定有效位,等,搞不定密钥的话我也没办法。 首先先看一个基本事实,当线性数据与定值进行 按位与 按位或 按位异或 时,其产生的结果也会呈现一定的规律,如下。

也就是说,结果中,按位与的图像基本呈现为周期性图像,按位或和按位异或的图像是与原图像总体趋势相同。

其他的按位取反、一次函数、二次函数同理。

这样的一个情况可以被我们引申一下。

金额 => (周期)线性数据校验位 => (按位与|按位或|按位异或|函数)结果图像

(同样可以引申到具有一定变化规律的非定值)

找金额位

一般方法1

最普遍的没有技巧的方法,可能是通过多次刷卡,寻找改变的地方,然后转化为10进制看是否是金额。

其实这个方法可以简化,即方法2。

 

一般方法2

金额其实是非常好找的,因为金额位很多时候可能并不加密,最多是前后位调换一下。

比如我卡里有23.45元,那么转换成hex就是929,即0929,寻找一下0929或者2909,基本就可以找到了。

 

Excel

在拥有足够连续金额的样本的前提下,我们可以将确认有影响到金额的数据块导出为文本,再导入excel。然后对同一块区(block)数据进行排列,转化为十进制再处理。像这样。

我们清楚地知道,数字都是满进制然后向前进一,而本身清零,也就是说,在有可能进位的地方,图像是这样的,呈现周期性线性关系。

没有产生进位的话,应该是看不出周期性的,就像这样。

因此,在需要至少两个位才能表示金额的情况下(一般就是金额大于2.55的情况),我们可以寻找前后两个(多个)图像呈线性关系及周期性线性关系的地方,其中周期越小则金额位越低。

由此,在金额位不加密的情况下,我们可以快速定位金额位。如上图数据就是C列B列合起来为金额。

 

找校验位

在金额位改变时明显有变化的,测试一下就知道是不是校验位了。

 

计算校验位

计算校验位,我用excel。(这里的表格数据已与上方有所不同,仅供参考)

为了数据样本的纯净,我们可能需要较多的等金额差的样本,比如73 70.2 67.4这样,数据间隔相同。

根据上面的理论,在获取一定数量的数据样本之后,我们可以得到这样的表格。

从迷你折线图里可以非常清晰的看到,CDR三列有明显的变化。

根据上面的理论以及计算,可以知道CD列为金额位,则R列为校验位。

观察折线图,我们发现R列数据也是呈现周期性变化,甚至峰值与C列非常接近,考虑到数据间隔粒度影响(间隔2.8而不是0.01),可以猜测R列数据峰值与C列相同,甚至,事实上,我们可以直接猜测,最小值为0,最大值为255。那么,也就是说,可能存在一个周期函数f(x),使得f(C)=R,并且在周期内,函数是线性相关的。

如果的确在周期内是线性相关的,那么在同一个周期内,两个值的差值应该是一样的。

于是我们需要寻找同一个周期内活动的金额位和校验位,比如

测试发现差值略有偏差,而且不同差值间隔为1,因此考虑D列的影响,这三行数据的D列刚好间隔都为1。

那么函数就变成了f(C)±D=R,或者是f(C±D)=R

接下来就是做数学题了。

从数据上来看,一个周期应该是256,也就是0-255/00-FF这256个数字构成一个周期,主要是因为一个字节只能放下这么多数字。

我们尝试去除周期影响,得到如下数据。

再计算CD列和R列的差值。

结果如A列所示。

到这里,基本已经接近尾声了,稍微处理一下就好了。

根据以上数据,推出公式:R=(C+D-135)%256

推出的计算结果与校验位完全一致。

 

进阶

现在我们可以更改卡内数据了。但是由于目前金额位只显示了两位,也就是FFFF,因此目前被限制在655.35元。

先让我们尝试一下改成655.35吧。

依然是万能的excel。

测试成功。

因为金额显示的是扣款后的金额,每次扣款2.8元,652.55+2.8=655.35。

接下来尝试突破位数限制,有两条路可走:1.去充值,2.猜。

在很多时候,充值并不是一个好的建议,容易引起工作人员怀疑,另一方面,我这张卡是复制来的,由于某种原因,充值不了。

所以就猜吧。

 

突破位数限制

由于新增了一位,因此我们需要重新考量相关的计算。

可以利用已有数据进行合理猜测,比如金额为73时,前三位为841C00。

让新的公式可以符合已有数据即可。

 

金额

之前在考虑逆序规则,其实仔细想想,规则肯定是左到右,低位到高位。

即01869F=>9F8601

 

校验位

校验位原公式为R=(C+D-135)%256,那么需要加入E位,并确保E位为0的时候,f(C,D,E)=f(C,D)

因此,E的加入不能带入新的常数,最多只能带入系数,也就是说常数还是-135,而E的系数可以不为1。

简单猜测一下,公式R=(C+D+E-135)%256

计算结果:9F86010000001106020C36150900009F

测试一下。

完成。

测试一下最大值是不是999.99

最大值是1000,再高就无法读取了。

实验数据:RFID数据分析.zip

相关文章
|
4月前
|
数据处理 Python
Python教程:生成Excel并更改表头
Python教程:生成Excel并更改表头
69 0
com.alibaba.excel包教程:Excel数据导出加工进阶篇
com.alibaba.excel包教程:Excel数据导出加工进阶篇
1415 0
|
2月前
|
Java 数据安全/隐私保护
Java无模版导出Excel 0基础教程
经常写数据导出到EXCEL,没有模板的情况下使用POI技术。以此作为记录,以后方便使用。 2 工具类 样式工具: 处理工具Java接口 水印工具 导出Excel工具类 3 测试代码 与实际复杂业务不同 在此我们只做模拟 Controller Service 4 导出测试 使用Postman进行接口测试,没接触过Postman的小伙伴可以看我这篇博客Postman导出excel文件保存为文件可以看到导出很成功,包括水印 sheet页名称自适应宽度。还有一些高亮……等功能可以直接搜索使用
Java无模版导出Excel 0基础教程
|
3月前
|
XML Java 测试技术
《手把手教你》系列技巧篇(六十七)-java+ selenium自动化测试 - 读写excel文件 - 中篇(详细教程)
【6月更文挑战第8天】本文介绍了Java中操作Excel的工具,包括POI和JXL。POI支持处理Office 2003及以下的OLE2格式(.xls)和2007以上的OOXML格式(.xlsx)。而JXL只能处理2003版本的Excel文件。文章详细讲解了如何下载和使用JXL库,并给出了一个简单的Java代码示例,展示如何读取2003版Excel文件中的数据。在实际项目中,由于JXL对新版本Excel的支持限制,通常推荐使用POI。
61 5
|
3月前
|
Java 测试技术 Apache
《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)
【6月更文挑战第9天】本文介绍了如何使用Java处理Excel文件中的不同数据类型,包括日期、数字、布尔值和标签(常规字符串)。文章提供了两个示例,分别使用JXL库和Apache POI库来读取Excel文件。
43 1
|
3月前
|
Java 测试技术 Apache
《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 - 上篇(详细教程)
【6月更文挑战第7天】本文介绍了在Java自动化测试中如何操作Excel数据。文章提到了当测试数据存储在Excel文件时,可以使用Apache的POI库来读写Excel。POI提供了对OLE2(.xls)和OOXML(.xlsx)格式的支持,比JXL库功能更全面。文章还详细讲解了如何下载和添加POI库到项目中,以及准备测试用的Excel文件。最后,给出了一个简单的Java代码示例,演示如何读取Excel文件的内容。
43 1
|
3月前
|
easyexcel Java API
Apache POI与easyExcel:Excel文件导入导出的技术深度分析
Apache POI与easyExcel:Excel文件导入导出的技术深度分析
|
4月前
|
存储 数据挖掘
Excel 实例:单因素方差分析ANOVA统计分析
Excel 实例:单因素方差分析ANOVA统计分析
|
4月前
|
Java easyexcel Maven
【Java专题_04】集成EasyExcel进行Excel导入导出详细教程
【Java专题_04】集成EasyExcel进行Excel导入导出详细教程
387 0
|
JSON 数据格式
excel的导入导出和异常非空 总计等处理;导出多个excel合并导出zip(hutool导出)(详细讲解包括分析等等)(一)
excel的导入导出和异常非空 总计等处理;导出多个excel合并导出zip(hutool导出)(详细讲解包括分析等等)(一)
132 0