Arduino教程 RFID-RC522读IC卡门禁原理及破解防御

原文链接:https://blog.csdn.net/Leytton/article/details/73480974

【文章特色:1、提出IC卡破解原理和简单有效的防御方法2、网上其他文章对于硬件如何接线说得模糊不清】

1、序言

先说下简单门禁系统的原理:

(1)IC卡激活:门禁卡管理员将卡片放到读卡器、这时软件读取到IC卡的UID序列号信息(相当于身份证号码),将这个UID录入数据库激活IC卡。

(2)刷卡:刷卡时读卡器读取到UID,查询数据库,如果数据库中存在这个UID则表示有效用户,继而控制继电器断电,此时电磁锁开门。

不亦买的RC522模块采用SPI通信、据说也有串口通信的不过成本较高。大家可以看看这个模块的主要配件:卡和读卡器偷笑

2、加载RC522库文件

 Arduino本身有个操作RC5200的库,如下图所示,打开Arduino开发工具中管理库

搜索"RC522",选择"MFRC522"安装即可

点击"More info"可以跳转到github地址https://github.com/miguelbalboa/rfid ,下文会有提及。

安装完毕后,可以看到关于MFRC522的库示例,有读取UID、获取区块信息、修改UID、卡片信息复制等

注:一般而言IC卡是不能修改0扇区0区块的UID和厂商信息数据,这些是生产时就确定下来的的(关于IC卡的存储结构有空再发文介绍,小伙伴们可以去网上查阅这方面资料挺多的),能够全扇区修改的俗称UID卡才支持修改UID,一些不负责的门禁系统厂家仅根据UID来判断用户身份是不可靠的,一个简单的方法是在读之前先写UID操作,如果可写那么这张卡就是UID卡即复制卡,判断无效,系统也可记录是哪张IC卡被复制了用于追溯非法行为,仅供交流与学习,请勿用于非法用途哦吐舌头

3、模块引脚接线

此处是网络上大部分相关文章没有提及的,只告诉了如何接线,却不告诉我们为什么这样接,甚至连Arduino版本都不说清楚。

我们打开ReadNUID的示例里面有各种版本Arduino与RC522的引脚连接图,我们按照这个接线即可。在上文提及的github项目主页也有介绍。

RC522一共8个引脚,如图所示:

3.3V供电、GND接地不用多说,IRQ是中断才用到的此处没有用到可以不接,其余5个引脚接法如下表所示:

 
  1. /* Typical pin layout used:

  2. * -----------------------------------------------------------------------------------------

  3. * MFRC522 Arduino Arduino Arduino Arduino Arduino

  4. * Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro

  5. * Signal Pin Pin Pin Pin Pin Pin

  6. * -----------------------------------------------------------------------------------------

  7. * RST/Reset RST 9 5 D9 RESET/ICSP-5 RST

  8. * SPI SS SDA(SS) 10 53 D10 10 10

  9. * SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16

  10. * SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14

  11. * SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15

  12. */

 

4、程序代码

此处测试的Arduino型号是Arduino Nano V3.0,其他型号请结合上表修改引脚号。

示例代码读取UID,并将其分别以十进制和十六进制输出到串口,简化版如下:

 
  1. #include <SPI.h>

  2. #include <MFRC522.h>

  3.  
  4. #define SS_PIN 10

  5. #define RST_PIN 9

  6.  
  7. MFRC522 rfid(SS_PIN, RST_PIN); //实例化类

  8.  
  9. // 初始化数组用于存储读取到的NUID

  10. byte nuidPICC[4];

  11.  
  12. void setup() {

  13. Serial.begin(9600);

  14. SPI.begin(); // 初始化SPI总线

  15. rfid.PCD_Init(); // 初始化 MFRC522

  16. }

  17.  
  18. void loop() {

  19.  
  20. // 找卡

  21. if ( ! rfid.PICC_IsNewCardPresent())

  22. return;

  23.  
  24. // 验证NUID是否可读

  25. if ( ! rfid.PICC_ReadCardSerial())

  26. return;

  27.  
  28. MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  29.  
  30. // 检查是否MIFARE卡类型

  31. if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&

  32. piccType != MFRC522::PICC_TYPE_MIFARE_1K &&

  33. piccType != MFRC522::PICC_TYPE_MIFARE_4K) {

  34. Serial.println("不支持读取此卡类型");

  35. return;

  36. }

  37.  
  38. // 将NUID保存到nuidPICC数组

  39. for (byte i = 0; i < 4; i++) {

  40. nuidPICC[i] = rfid.uid.uidByte[i];

  41. }

  42. Serial.print("十六进制UID:");

  43. printHex(rfid.uid.uidByte, rfid.uid.size);

  44. Serial.println();

  45.  
  46. Serial.print("十进制UID:");

  47. printDec(rfid.uid.uidByte, rfid.uid.size);

  48. Serial.println();

  49.  
  50. // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡

  51. rfid.PICC_HaltA();

  52.  
  53. // 停止读卡模块编码

  54. rfid.PCD_StopCrypto1();

  55. }

  56.  
  57. void printHex(byte *buffer, byte bufferSize) {

  58. for (byte i = 0; i < bufferSize; i++) {

  59. Serial.print(buffer[i] < 0x10 ? " 0" : "");

  60. Serial.print(buffer[i], HEX);

  61. }

  62. }

  63.  
  64. void printDec(byte *buffer, byte bufferSize) {

  65. for (byte i = 0; i < bufferSize; i++) {

  66. Serial.print(buffer[i] < 0x10 ? " 0" : "");

  67. Serial.print(buffer[i], DEC);

  68. }

  69. }

 

5、运行结果

依次将卡A、卡B、卡A放到RC522读卡区,串口打印信息如下

感谢梦鸽推上首页分享给更多的人看到^_^

  • 13
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值