使用NFC快速读取二代身份证uid
读取二代身份证的uid的流程的资料是公开的,参考使用PN532读取的两篇文章,用ST25R3911B测试了下,也可以读出取二代卡的uid,以下是详细资料和修改好的代码
目录
前言
读取二代身份证的uid的流程的资料是公开的,参考了以下两篇文章,用ST25R3911B测试了下,也可以读出取二代卡的uid,接下来介绍下
接下来让我们一起读取邪恶贝利亚的UID吧
一. ST25R3911B芯片资料
1.1 公开的资料
参考st论坛:有没有ST25R3911B简单的对NFC卡进行读写的例子
帖子有网盘回复,里面有很多st官方的st25r3911的示例代码,可以下载参考。
st25r3911b开发板的资料
ST25R3911B NFC Board - Waveshare Wiki
提取这里的资源,下载后里面也有读取二代卡的例程,如下图
我试了下,我的二代卡可以读,但是这几年21年后生产的二代卡读不了。修改下demo.c里面的发送包方式就都可以读了
二. 大致流程
2.1 读取二代卡流程
1.读卡器发送 :05 00 00 (询卡命令)
二代卡回复:50 00 00 00 00 xx xx xx xx xx xx xx (代表询卡成功)
2.读卡器发送:1d 00 00 00 00 00 08 01 08 (对二代身份证进行选卡操作)
二代卡回复:08 xx xx ( 回复的首字节为08 代表SELECT命令操作成功)
3.读卡器发送:00 36 00 00 08 (读取UID命令)
二代卡回复:xx xx xx xx xx xx xx xx 90 00 (90 00 为应答,前面8字节为卡片实际的UID)
三. 修改地方
3.1 demoPollNFCB修改后
二代卡是typeB类型的卡,直接修改demo.c的demoPollNFCB例程就行(这里修改好了),我这里把logo打印有点问题,就直接删除了,直接拿串口打印printf函数调试,
bool demoPollNFCB( void ) { ReturnCode err; rfalNfcbListenDevice nfcbDev; bool found = false; uint8_t devCnt = 0; /*******************************************************************************/ /* ISO14443B/NFC_B_PASSIVE_POLL_MODE */ /*******************************************************************************/ rfalNfcbPollerInitialize(); /* Initialize for NFC-B */ rfalFieldOnAndStartGT(); /* Turns the Field On if not already and start GT timer */ printf("this is nfc b\r\n"); printf("begin---------------------\r\n"); ///////////////////////这里新添加///////////////////////////// // err = rfalNfcbPollerTechnologyDetection(RFAL_COMPLIANCE_MODE_ISO, &nfcbDev.sensbRes, &nfcbDev.sensbResLen); // //没找到卡片 // printf("rfalNfcbPollerTechnologyDetection---err=%d\r\n",err); { //1.读卡器发送 :05 00 00 (询卡命令) uint8_t ID_CMD[] = {0x05,0x00,0x00}; uint16_t rxLen; err = rfalTransceiveBlockingTxRx( ID_CMD, sizeof(ID_CMD), gRxBuf.rxBuf, sizeof(gRxBuf.rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, gDevProto.isoDepDev.info.FWT + gDevProto.isoDepDev.info.dFWT ); printf("rfalTransceiveBlockingTxRx_ID_CMD1----------err=%d\r\n",err); } platformDelay(100); { //2.读卡器发送:1d 00 00 00 00 00 08 01 08 (对二代身份证进行选卡操作) uint8_t ID_CMD[] = {0x1d,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x08}; uint16_t rxLen; err = rfalTransceiveBlockingTxRx( ID_CMD, sizeof(ID_CMD), gRxBuf.rxBuf, sizeof(gRxBuf.rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, gDevProto.isoDepDev.info.FWT + gDevProto.isoDepDev.info.dFWT ); printf("rfalTransceiveBlockingTxRx_ID_CMD1----------err=%d\r\n",err); } { //3.读卡器发送:00 36 00 00 08 (读取UID命令) uint8_t ID_CMD[] = {0x00,0x36,0x00,0x00,0x08}; uint16_t rxLen; /* Exchange APDUs */ err = rfalTransceiveBlockingTxRx( ID_CMD, sizeof(ID_CMD), gRxBuf.rxBuf, sizeof(gRxBuf.rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, gDevProto.isoDepDev.info.FWT + gDevProto.isoDepDev.info.dFWT ); printf("rfalTransceiveBlockingTxRx_ID_CMD2----------err=%d\r\n",err); if(err == 0) { printf("ID card found. 'UID': %s\r\n", hex2Str(gRxBuf.rxBuf, rxLen-2));//90 00 为应答,gRxBuf.rxBuf 的前面8字节为卡片实际的UID } } printf("end---------------------\r\n"); platformDelay(500); return found; }
3.2 demoPollNFCB修改前
未修改的例程,这里是前面那个网盘下载的源码,这个也可以读取UID,只是最新的二代卡读取不了,前面的demoPollNFCB修改后是可以直接读取的
/*! ***************************************************************************** * \brief Poll NFC-B * * Configures the RFAL to NFC-B (ISO14443B) communication and polls for a nearby * NFC-B device. * If a device is found turns On a LED and logs its UID. * Additionally, if the Device supports ISO-DEP protocol (ISO144443-4) it will * activate the device and try exchange some APDUs with PICC * * \return true : NFC-B device found * \return false : No device found * ***************************************************************************** */ bool demoPollNFCB( void ) { ReturnCode err; rfalNfcbListenDevice nfcbDev; bool found = false; uint8_t devCnt = 0; /*******************************************************************************/ /* ISO14443B/NFC_B_PASSIVE_POLL_MODE */ /*******************************************************************************/ rfalNfcbPollerInitialize(); /* Initialize for NFC-B */ rfalFieldOnAndStartGT(); /* Turns the Field On if not already and start GT timer */ err = rfalNfcbPollerCollisionResolution( RFAL_COMPLIANCE_MODE_NFC, 1, &nfcbDev, &devCnt ); if( (err == ERR_NONE) && (devCnt > 0) ) { /**********************************************/ /* NFC-B card found */ /* NFCID/UID is contained in: sensbRes.nfcid0 */ found = true; platformLog("ISO14443B/NFC-B card found. UID: %s\r\n", hex2Str(nfcbDev.sensbRes.nfcid0, RFAL_NFCB_NFCID0_LEN)); platformLedOn(PLATFORM_LED_B_PORT, PLATFORM_LED_B_PIN); } /* Check if device supports ISO14443-4/ISO-DEP */ if( nfcbDev.sensbRes.protInfo.FsciProType & RFAL_NFCB_SENSB_RES_PROTO_ISO_MASK ) { /* Activate the ISO14443-4 / ISO-DEP layer */ rfalIsoDepInitialize(); err = rfalIsoDepPollBHandleActivation((rfalIsoDepFSxI)RFAL_ISODEP_FSDI_DEFAULT, RFAL_ISODEP_NO_DID, RFAL_BR_424, RFAL_ISODEP_ATTRIB_REQ_PARAM1_DEFAULT, &nfcbDev, NULL, 0, &gDevProto.isoDepDev ); if( err == ERR_NONE ) { platformLog("ISO14443-4/ISO-DEP layer activated. \r\n"); /* Exchange APDUs */ demoSendAPDUs(); } } else if(nfcbDev.sensbRes.nfcid0[0]==0 && nfcbDev.sensbRes.nfcid0[1] == 0 && nfcbDev.sensbRes.nfcid0[2] == 0 && nfcbDev.sensbRes.nfcid0[3] ==0) { rfalIsoDepInitialize(); err = rfalIsoDepPollBHandleActivation((rfalIsoDepFSxI)RFAL_ISODEP_FSDI_DEFAULT, RFAL_ISODEP_NO_DID, RFAL_BR_106, RFAL_ISODEP_ATTRIB_REQ_PARAM1_DEFAULT, &nfcbDev, NULL, 0, &gDevProto.isoDepDev ); if( err == ERR_NONE ) { platformLog("ID card activated. \r\n"); uint8_t ID_CMD[] = {0x00,0x36,0x00,0x00,0x08}; uint16_t rxLen; /* Exchange APDUs */ err = rfalTransceiveBlockingTxRx( ID_CMD, sizeof(ID_CMD), gRxBuf.rxBuf, sizeof(gRxBuf.rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, gDevProto.isoDepDev.info.FWT + gDevProto.isoDepDev.info.dFWT ); if( err == ERR_NONE ) platformLog("ID card found. 'UID': %s\r\n", hex2Str(gRxBuf.rxBuf, rxLen-2)); } } return found; }
四. 读取的数据
4.1 抓的交互数据包
这是demoPollNFCB修改后,使用读卡器发送数据包和二代卡回复数据包
五. 参考资料
5.1 论坛
5.2 资料
百度网盘 请输入提取码 提取码: 3j44)
更多推荐








所有评论(0)