一种无法复制、无法破解的IC卡数据算法和读写流程
此算法和流程基于最常见的MD5算法。无法复制和篡改数据。
基础知识可参考另外两篇文章。
没有基础可以先阅读以上两篇文章,有基础的可以跳过。
此算法和流程具有以下特点:
1、无法复制、无法破解、无法篡改数据
2、不需要使用特殊IC卡,普通恩智浦(飞利浦)M1卡即可
3、不需要使用特殊读头
4、不需要对卡片进行加密,即使全扇区都是默认密码,不影响防复制和防破解
5、算法完全公开,不影响防复制和防破解
6、读写区块少,减少卡片操作次数,降低刷卡失败率
7、可使用离线刷卡模式
8、多个客户之间隔离,卡片无法跨区使用
9、单个客户的不同应用,也可以隔离
【注释】
防复制是指,无论复制多少卡片,始终限定只有一张卡片为合法卡片,始终只有一张卡片能成功刷卡。
防破解防篡改数据是指,在现有计算能力条件下,通过暴力破解的方式进行破解,至少耗时100年以上。
声明
本站基于开源和共享的精神,本算法和流程有版权,本人声明原创,但是随便使用,不需要授权,也不收费。
如有第三方使用,行行好,随便什么时候,给我发个消息知会一声就行。如果发个消息的时间也没有,那也没关系。
以下算法和流程,辅以一个实际示例来描述。可根据实际需求,自行升级、修改和完善算法及流程。
前提定义
为了方便描述和理解,现定义以下几项:
MD5算法:MD5(”参数”) = MD5结果
示例:MD5(123456) = E10ADC3949BA59ABBE56E057F20F883E
字符串拼接:A + B = AB
示例:abc + efg = abcefg
版本号:厂家自定义的编码,不同的客户,不同的应用,厂家可以在读卡器和发卡软件中写入不同的版本号
示例:版本号 = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz1234
下文出现版本号的值,以示例的值参与计算。示例的版本号长度为128字符,A-Z,a-z,0-9
实际使用可以自行设置,长度越长,字符种类越多,系统越难破解
客户号:厂家给客户自定义的编码,不同的客户,厂家可以在读卡器和发卡软件中写入不同的客户号
示例:客户号 = 1234ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz
下文出现客户号的值,以示例的值参与计算。示例的版本号长度为128字符,A-Z,a-z,0-9
实际使用可以自行设置,长度越长,字符种类越多,系统越难破解
假设使用场景
梯控刷卡系统,有一张IC卡,卡片2020年12月31日到期,卡号为12345678
有效期:20201231
卡号:12345678
数据算法
数据明文写入,生成一个滚动码和一个校验码。
滚动码 = 操作卡片时间(转换为16进制大写字母)
示例:
2019年12月31日0时0分0秒 → 十进制=191231000000,滚动码=2C86417DC0 (十六进制)
2099年12月31日23时59分59秒 → 十进制=991231235959,滚动码=E6C9FC5777 (十六进制)
滚动码长度为10位
校验码算法
1、加密版本号 = MD5(滚动码+版本号)
2、原始码 = MD5(卡号+数据+滚动码+客户号+加密版本号)
3、校验码 = 原始码去掉开头10位字符
校验码长度为22位
注意字母区分大小写!
滚动码+校验码,总长度32位
数据示例
原理说明
利用了MD5的特点,计算结果长度固定,任何修改都将导致结果巨大变化,计算不可逆。
校验码由卡号、数据、滚动码、版本号、客户号计算生成,任何一个数据发生改变,校验码都会发生巨大变化。所以即使知道本算法,在不知道版本号和客户号的情况下,也无法生成正确的校验码。
客户号可以设为物业可自定义(即对物业公开),也可以设为只有厂家可以设置(即对物业保密)。
版本号只允许厂家设置,对所有人保密。
如果客户号允许物业自定义,物业可能会偷懒设置一个简单的客户号,导致容易被暴破,所以需要引入版本号。客户号可以隔离不同的客户,版本号可以用来隔离同一个用户的不同应用。不同客户,不同应用,建议全都设置不同的版本号和客户号,并且长度要足够长。
由于版本号和客户号每处都不一样,所以:
1、卡匠破解发卡软件(未配置),由于发卡软件不带有版本号和客户号,无法生成校验码
2、物业破解自己的发卡软件(已配置),获得自己物业的版本号和客户号,无法获得其它物业的版本号和客户号,无法伪造校验码
3、嗅探获得单张卡片数据,不知道客户号和版本号,无法生成校验码
由于生成验证码时,版本号和客户号缺一不可,相当于两把钥匙需要同时使用,所以:
1、物业自定义客户号,设置一个厂家不知道的客户号,即使被厂家出卖数据给第三方,第三方也会因为不知道客户号,无法伪造验证码,以此保证物业安全
2、写入设备和软件的版本号只有厂家知道,即使物业想私自买进设备,或者卖出给别人,都会因为版本号不一致,导致系统无法使用,以此保证厂商利益
由于版本号和客户号长度足够长,示例中使用了英文大写和小写字母,数字,构成的128位长度字符。单版本号一项,可能性即有62的128次方,版本号客户号一起,可能性则有62的256次方,使用暴力破解今生无望。并且由于未加密前的原文长度过长,也不会有字典收录,字典破解也无法使用。
多个数据可以拼接后参与计算。示例中只有一个数据20201231,如果有2个数据A和B,先组合成AB,再带入计算即可。多个数据,以此类推。利用MD5的特点,最终生成的校验码长度都是固定的。
利用MD5计算结果长度固定的特点,最后生成一个32位的滚动校验码(10位滚动码+22位校验码),只占用一个扇区的一个块,滚动和校验功能只需读卡器读写一次,减少卡片操作次数,降低刷卡失败率。
刷卡流程
发卡流程
读卡号,根据卡号、数据、滚动码、版本号、客户号计算出校验值,写入数据,写入滚动码和校验值。
刷卡流程
1、读卡号,读数据,读滚动码和校验码
2、根据卡号查找读卡器内是否有这张卡的刷卡记录,没有记录则为首次刷卡,不比对滚动码
3、非首次刷卡,比对读卡器内保存的滚动码和卡内滚动码是否一致,不一致则判定非法
4、根据卡号、数据、滚动码、版本号、客户号计算校验码,和卡内读出来的校验码进行比对,不一致则判定非法卡片
5、根据当前时间生成新的滚动码,重新计算校验码,将新的滚动码和校验码写入卡片,写卡失败则中断操作
新的滚动码没有正式更新到读卡器内存前,必须保存在读卡器的临时变量中!
6、写卡成功后,将新的滚动码保存到读卡器
只能将临时变量中的新滚动码,正式更新到读卡器内存。严禁再读一次卡片,将卡片内滚动码保存!卡片内滚动码可能因为是gtu卡而锁定!导致滚动码不更新!
7、根据数据,执行后续操作(开门、电梯按钮亮灯等)
升级难度
本算法生成的滚动码和校验码已经非常简单明了。有兴趣升级难度的,可以在没有数据的区块,或者数据的空位里,填入一些随机字符,起到迷惑的作用。无意义的随机字符和校验码毫无规律,在不知道算法的情况下,想破解,连下手的地方都找不到。
破解遐想
目前此算法和流程在实际场景中应该没有漏洞,但我还是从理论出发,想了一个破解方法。
【云同步模拟卡】
1、NFC芯片模拟M1卡,通过编程方式做到模拟效果100%,不发射CPU模拟卡特有的ats等。现有手机NFC模拟功能,应该是出于安全因素,并不会完全拟真实体卡片。自己开发肯定能做到100%模拟,因为卡片是非接触式的,具体到底层就是线圈发射和接收的无线电波的变化,每一个细节都做到相同,就能完全拟真。
2、芯片内数据自动在线云同步。100人使用,任意一人刷卡,卡内数据变化,其余99人的芯片自动同步最新数据。
以上破解方法,仅存在于理论中。。。目前手机自带NFC功能较为封闭,手机厂商出于安全因素或上级监管要求,NFC功能有较大限制,例如不允许模拟厂家代码。而NFC自行开发,难度较大,还要做到云同步,整体成本较高。理论上云同步模拟卡可以复制所有的IC卡。
盈利模式
一个好的设计,必须要有其价值。本算法防复制、防破解,并不是单一目的,也有很好的盈利前景。
很多人说生意不要一下做绝,东西一点点卖。这种想法其实挺小气。QQ免费,抢占了巨大的用户群,淘宝也是免费的,一开始才会有那么多人开店,安卓开源一下,抢下了智能手机的新风口。而且现在CPU卡逐渐替代M1卡,人脸识别逐渐兴起,各种联网校验,微信扫一扫开门,传统做卡行业,已经是夕阳产业,难道就没有一点危机感?
做出彻底防复制防破解的系统,并不会一次把生意做绝。虽然以后物业不会花钱继续升级系统,但也是变相地捆绑住了用户。而且不用特殊设备和特殊卡的低成本方案,不论是新装还是改装,都有价格优势,还有防复制防破解的特性,一定会对物业有极大吸引力,可以帮助厂商快速提升市场占有率、知名度、口碑。客户群体大了,玩法就多了,推广告,增值服务,继续打入其它产品,等等,不一一举例。有客户量,就有资本。再拿梯控门禁为例,完全可以把系统限定为只能使用厂家的卡片,卡片一出厂就写入校验码,发卡软件识别校验码,不合法的卡片不允许发卡。得益于算法的优点,校验码无法伪造,物业只能从厂家买卡。单张卡片的利润不一定有多少,但是架不住用户量大,光耗材都是一笔不小的收入。
THE END
欢乐的时光特别快,又到时候讲拜拜~
欢迎补充,有错漏可以留言指出,谢谢支持。
有发现任何漏洞,请指出,一起完善算法和流程!