首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mifare卡:区分4字节和7字节UID

Mifare卡:区分4字节和7字节UID
EN

Stack Overflow用户
提问于 2016-06-15 14:02:48
回答 4查看 12.9K关注 0票数 6

我有一个读卡器,它总是报告64位,并且可以读取带有4或7字节UID的卡片。

例如,我认为它可以报告:

  • 04-18-c5-82-00-00-00-00 -表单uid0-uid1-uid2-uid3-00-00-00-00中的4字节UID。
  • 04-18-c5-82-f1-3b-81-00 -表单uid0-uid1-uid2-uid3-uid4-uid5-uid6-00中的7字节UID。

是什么使7字节的UID不能将uid4、uid5和uid6设置为零?这上面有规格说明吗?如果是,哪种规格?

EN

回答 4

Stack Overflow用户

发布于 2016-06-24 09:15:38

是什么使7字节的UID不能将uid4、uid5和uid6设置为零?

没什么。UID的格式(由MIFARE卡使用)是在ISO/IEC 14443-3中定义的.专门为MIFARE卡,NXP有(或至少有?)对于4字节UID,还有一些进一步的分配逻辑,但这是不可公开的。

能区分这两种情况吗?

如果读取器准确地以示例中显示的形式输出UID,则答案是“否”(至少不是可靠的)。然而,一些阅读器输出8字节的UID,并包含7字节-UID的级联标记。因此,对于这些读取器,所有的7字节-UID都以0x88开头.你的读者似乎不是这样的。

是否有可能将这两种情况区分开来?

我想到了一些区分4字节UID和7字节UID的策略.

  1. 7字节-UID的第一个字节是制造商代码(如ISO/IEC7816-6中定义的那样)(关于如何获得列表,请参见如何使用Android从NFC标签中检测制造商? )。因此,如果您有一组有限的制造商(例如,如果您只使用MIFARE卡和来自NXP的芯片),则可以将以NXP的制造商代码(0x04)开头的所有UID解释为7字节-UID。然而,您应该知道,4字节的UID也可以从0x04开始。因此,这种方法不完全可靠,在某些情况下可能会失败。
  2. 4字节-UID的第一个字节不能包含以下任何值:'x8‘(带有x != '0'),'xF’。如果找到匹配这些值的第一个字节,则可以假定UID由7个字节组成。
票数 3
EN

Stack Overflow用户

发布于 2016-07-05 22:02:22

如果您能够得到ATQA响应,您可以区分它。ATQA的下一个字节显示了UID的长度。(4/7/10 10Byte)据我所知,没有其他方法可以用100%的保证来区分

br

票数 0
EN

Stack Overflow用户

发布于 2019-10-04 18:40:00

我知道派对有点晚了,但是对于任何有同样疑问的人来说,在4位字节UID中创建一个7字节UID的记录方式在这个pdf格式的附件-6中。

万一这一页掉了下来,下面会给出一张厚颜无耻的翻版。如果您在下面的代码片段中发现任何和所有错误,都应该属于NXP人员,而不是我。

,但是您如何知道标记是4字节还是7字节?

来自ATQA的回应。参考文件1的第15/36页和2文档的第8/15页。

如果文档发生故障,下面是文档1的相关摘录。

MF1S50yX/V1使用表11所示的ATQA或WUPA命令和表12中所示的SAK值(7字节UID变量的CL1命令CL2)回答。 注:第7和第8位中的ATQA编码表明根据ISO/IEC 14443的UID大小,与UID使用的设置无关。

6.附件,从双码UID派生NUID的源代码

代码语言:javascript
运行
复制
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define BYTE unsigned char
unsigned short UpdateCrc(unsigned char ch, unsigned short *lpwCrc)
{
ch = (ch^(unsigned char)((*lpwCrc) & 0x00FF));
ch = (ch^(ch<<4));
*lpwCrc = (*lpwCrc >> 8)^((unsigned short)ch << 8)^((unsigned
short)ch<<3)^((unsigned short)ch>>4);
return(*lpwCrc);
}
void ComputeCrc(unsigned short wCrcPreset, unsigned char *Data, int
Length, unsigned short &usCRC)
{
unsigned char chBlock;
do {
chBlock = *Data++;
UpdateCrc(chBlock, &wCrcPreset);
} while (--Length);
usCRC = wCrcPreset;
return;
}
void Convert7ByteUIDTo4ByteNUID(unsigned char *uc7ByteUID, unsigned char
*uc4ByteUID)
{
unsigned short CRCPreset = 0x6363;
unsigned short CRCCalculated = 0x0000;
ComputeCrc(CRCPreset, uc7ByteUID, 3,CRCCalculated);
uc4ByteUID[0] = (CRCCalculated >>8)&0xFF;//MSB
uc4ByteUID[1] = CRCCalculated &0xFF; //LSB
CRCPreset = CRCCalculated;
ComputeCrc(CRCPreset, uc7ByteUID+3, 4,CRCCalculated);
uc4ByteUID[2] = (CRCCalculated >>8)&0xFF;//MSB
uc4ByteUID[3] = CRCCalculated &0xFF; //LSB
uc4ByteUID[0] = uc4ByteUID[0]|0x0F;
uc4ByteUID[0] = uc4ByteUID[0]& 0xEF;
}
int main(void)
{
 int i;
 unsigned char uc7ByteUID[7] =
{0x04,0x18,0x3F,0x09,0x32,0x1B,0x85};//4F505D7D

 unsigned char uc4ByteUID[4] = {0x00};

 Convert7ByteUIDTo4ByteNUID(uc7ByteUID,uc4ByteUID);
 printf("7-byte UID = ");
 for(i = 0;i<7;i++)
 printf("%02X",uc7ByteUID[i]);
 printf("\t4-byte FNUID = ");
 for(i = 0;i<4;i++)
 printf("%02X",uc4ByteUID[i]);
 getch();
return(0);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37837730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档