java mifare_java – NTAG212 Mifare Ultralight与身份验证

我是NFC Android的新手,我已经坚持了几天试图通过身份验证获得NTAG212 Mifare Ultralight的第7页,我已经有了PWD和PACK来完成基于NTAG212文档的PWD_AUTH.

我这样做…

//assume password as array of bytes

//assume pack as array of bytes

try{

nfc.connect();

byte[] cmd1 = nfc.transceive(new byte[]{ (byte) 0x30, (byte) 0x00 }); //read the page 0 to make the NFC active

nfc.transceive(new byte[]{

(byte) 0x1B, //command for PWD_AUTH

pass[0],

pass[1],

pass[2],

pass[3]

});

byte[] cmd4 = nfc.transceive(new byte[]{ (byte) 0x30, (byte) 0x04 }); //read the page 4

}catch(TagLostException e){

e.printStackTrace();

}catch(IOException e){

e.printStachTrace();

}finally{

try{

nfc.close();

}catch(Exception e){

//display failed to close

}

}

我总是收到android.nfc.TagLostException:标签丢失了.将PWD_AUTH命令发送到NFC后出错.有人能告诉我我做错了什么吗?我的方法是否正确?请帮忙.

注意:我已经多次阅读过NTAG212的文档,搜索了google,stackoverflow和所有可能的资源.

TIA,

Kenster

解决方法:

您发送到标记的PWD_AUTH命令没有多大意义.

PWD_AUTH命令的想法是,如果使用正确的密码进行身份验证,则发送密码(4字节值)并且标签以其密码确认(PACK)值(2字节值)进行响应.然后,您可以根据预期密码确认来验证PACK值,以“验证”标签.

所以正确的命令是:

byte[] response = nfc.transceive(new byte[] {

(byte) 0x1B, // PWD_AUTH

pass[0], pass[1], pass[2], pass[3]

});

if ((response != null) && (response.length >= 2)) {

byte[] pack = Arrays.copyOf(response, 2);

// TODO: verify PACK to confirm that tag is authentic (not really,

// but that whole PWD_AUTH/PACK authentication mechanism was not

// really meant to bring much security, I hope; same with the

// NTAG signature btw.)

}

您需要什么才能启用密码保护(在NTAG212上):

>将PWD(第39页)设置为所需的密码(默认值为0xFFFFFFFF).

byte[] response = nfc.transceive(new byte[] {

(byte) 0xA2, // WRITE

(byte) 39, // page address

pass[0], pass[1], pass[2], pass[3]

});

>将PACK(第40页,字节0-1)设置为所需的密码确认(默认值为0x0000).

byte[] response = nfc.transceive(new byte[] {

(byte) 0xA2, // WRITE

(byte) 40, // page address

pack[0], pack[1], // bytes 0-1 are PACK value

(byte) 0, (byte) 0 // other bytes are RFU and must be written as 0

});

>将AUTHLIM(第38页,字节0,位2-0)设置为最大失败密码验证尝试次数(将此值设置为0将允许无限次数的PWD_AUTH尝试).

>将PROT(第38页,字节0,位7)设置为所需的值(0 =仅在写访问时需要PWD_AUTH,1 =读和写访问需要PWD_AUTH).

byte[] response = nfc.transceive(new byte[] {

(byte) 0x30, // READ

(byte) 38 // page address

});

if ((response != null) && (response.length >= 16)) { // read always returns 4 pages

boolean prot = false; // false = PWD_AUTH for write only, true = PWD_AUTH for read and write

int authlim = 0; // value between 0 and 7

response = nfc.transceive(new byte[] {

(byte) 0xA2, // WRITE

(byte) 38, // page address

(byte) ((response[0] & 0x078) | (prot ? 0x080 : 0x000) | (authlim & 0x007)),

response[1], response[2], response[3] // keep old value for bytes 1-3, you could also simply set them to 0 as they are currently RFU and must always be written as 0 (response[1], response[2], response[3] will contain 0 too as they contain the read RFU value)

});

}

>将AUTH0(第37页,字节3)设置为应该要求密码验证的第一页.

byte[] response = nfc.transceive(new byte[] {

(byte) 0x30, // READ

(byte) 37 // page address

});

if ((response != null) && (response.length >= 16)) { // read always returns 4 pages

boolean prot = false; // false = PWD_AUTH for write only, true = PWD_AUTH for read and write

int auth0 = 0; // first page to be protected, set to a value between 0 and 37 for NTAG212

response = nfc.transceive(new byte[] {

(byte) 0xA2, // WRITE

(byte) 37, // page address

response[0], // keep old value for byte 0

response[1], // keep old value for byte 1

response[2], // keep old value for byte 2

(byte) (auth0 & 0x0ff)

});

}

如果您使用MifareUltralight标记技术,而不是直接使用收发方法,您还可以使用readPages和writePage方法:

> READ命令

byte[] response = nfc.transceive(new byte[] {

(byte) 0x30, // READ

(byte) (pageAddress & 0x0ff) // page address

});

是等价的

byte[] response = nfc.readPages(pageAddress);

> WRITE命令

byte[] data = { (byte)..., (byte)..., (byte)..., (byte)... };

byte[] response = nfc.transceive(new byte[] {

(byte) 0xA2, // WRITE

(byte) (pageAddress & 0x0ff), // page address

data[0], data[1], data[2], data[3]

});

是等价的

nfc.writePage(pageAddress, data);

来源:https://www.icode9.com/content-1-474001.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
RC522是一种常用的射频卡读写器模块,它可以与Mifare Ultralight卡进行通信和交互。Mifare Ultralight是一种非接触式IC卡,广泛应用于门禁、交通、支付等领域。 在使用RC522写Mifare Ultralight卡之前,首先需要通过SPI或I2C接口将RC522模块与主控板连接起来,并完成相应的初始化设置,包括设置工作频率、选择通信方式等。 接下来,写入Mifare Ultralight卡的过程如下: 1. 寻卡:调用RC522模块的寻卡命令,使其开始搜索附近是否有Mifare Ultralight卡。一旦检测到卡片,RC522会返回卡片的序列号。 2. 防冲突:如果附近有多张Mifare Ultralight卡,则存在冲突,需要进行防冲突处理。RC522会根据卡片的序列号进行判断和选择。 3. 选卡:选择要进行操作的Mifare Ultralight卡,将其序列号发送给RC522。 4. 验证密钥:如果需要对卡片进行写操作,需要先验证密钥。根据卡片的类型,在RC522中选择合适的验证密钥命令,并将密钥发送给卡片进行验证。 5. 写入数据:将要写入的数据按照特定的格式组织好,并调用RC522模块的写数据命令,将数据发送给Mifare Ultralight卡进行写入操作。 6. 校验写入结果:根据返回的信息判断写入操作是否成功。如果成功,表示数据已经成功写入卡片;如果失败,可能是权限或其他原因导致的。 7. 结束通信:写入操作完成后,可以选择终止与Mifare Ultralight卡的通信,释放资源。 需要注意的是,写入Mifare Ultralight卡的操作需要遵循相关的协议和权限设置,确保数据的安全和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值