当前位置: 首页 > 知识库问答 >
问题:

如何在MIFARE Ultralight EV1标签上设置和取消设置密码?

祝宏放
2023-03-14

我希望能够在Android上使用NfcA?标签技术在MIFARE Ultralight EV1(MFOUL21)标签上设置和取消设置密码保护。

我知道我会使用<code>nfcA。tranceive()方法,但我不确定该方法的参数是什么,所以有人可以提供代码段来设置和取消设置密码吗?

更新:

关于 TapLinx 库,我基本上希望 nfcA.transceive(...) 代码片段等同于:

  1. ultralightEV1.programPwd(密码字节)
  2. <code>超轻EV1.programPack(packBytes)
  3. ultralightEV1.enablePasswordProtection(已启用,来自PageNum)
  4. ultralightEV1.authenticatePwd(密码字节)

共有2个答案

甄鹏云
2023-03-14

您可以使用恩智浦的TapLinx库(https://www.mifare.net/en/products/tools/taplinx/ 提供)以抽象的方式与MIFARE Ultralight EV1进行通信

要使用“收发器”,请参阅http://www.advanide.com/wp-content/uploads/products/rfid/UltraLightEV1_MF0ULX1.pdf需要使用WRITE命令(A2),地址为25-28h。

更新:要发送的命令应该是(对于MFOUL21):

>

  • ultralightEV1.programPwd(passwordBytes);A227AABBCCDD(用于密码AABBCCDD)

    ultralightEV1.programPack(packBytes);A228EEFF0000(适用于包装 0000)

    ultralightEV1.enable密码保护(启用,from mPageNum); A225xx0000yy(其中xx是调制模式;00…强mod。禁用;01…启用强mod;yy=密码保护开始的页面)

    ultralightEV1.authenticatePwd(密码字节);1baabbcdd

  • 邹京
    2023-03-14

    ultralight v1 . authenticatepwd(password bytes);

    为了使用MIFARE Ultralight EV1标签(或NTAG21x)的密码进行身份验证,您需要发送PWD_AUTH(0x1B)命令(并可能验证PACK响应是否符合您的期望):

    byte[] pass = { (byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78 };
    byte[] pack = { (byte)0x9A, (byte)0xBC };
    
    byte[] response = nfc.transceive(new byte[] {
        (byte) 0x1B, // PWD_AUTH
        pass[0], pass[1], pass[2], pass[3]
    });
    if ((response != null) && (response.length >= 2)) {
        // success
        byte[] packReceived = Arrays.copyOf(response, 2);
        if (Arrays.equal(packReceived, pack)) {
            // PACK verified, so 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.)
        }
    }
    

    ultralightEV1.programPwd(密码字节);ultralightEV1.programPack(packBytes);

    对于MF0UL11,密码在第0x12页,密码确认(PACK)在第0x13页(配置页从0x10开始)。对于MF0UL21,密码在第0x27页,密码确认(PACK)在第0x28页(配置页从0x25开始)。

    为了动态查找您的标记是MF0UL11还是MF0UL21,您可以发送GET_VERSION(0x60)命令:

    int cfgOffset = -1;
    
    byte[] response = nfc.transceive(new byte[] {
        (byte) 0x60 // GET_VERSION
    });
    if ((response != null) && (response.length >= 8)) {
        // success
        if ((response[0] == (byte)0x00) && (response[1] == (byte)0x04)) {
            // tag is from NXP
            if (response[2] == (byte)0x03) {
                // MIFARE Ultralight
                if ((response[4] == (byte)0x01) && (response[5] == (byte)0x00) {
                    // MIFARE Ultralight EV1 (V0)
                    switch (response[6]) {
                        case (byte)0x0B:
                            // MF0UL11
                            cfgOffset = 0x010;
                            break;
                        case (byte)0x0E:
                            // MF0UL11
                            cfgOffset = 0x025;
                            break;
    
                        default:
                            // unknown
                            break;
                    }
                }
            }
        }
    }
    

    找到配置页的开头后,可以使用 WRITE (0xA2) 命令更新这些页的值(假设您使用当前密码进行身份验证,则配置页不受保护):

    byte[] response = nfc.transceive(new byte[] {
        (byte) 0xA2, // WRITE
        (byte)((cfgOffset + 2) & 0x0FF),    // page address
        pass[0], pass[1], pass[2], pass[3]  // new page data
    });
    response = nfc.transceive(new byte[] {
        (byte) 0xA2, // WRITE
        (byte)((cfgOffset + 3) & 0x0FF),          // page address
        pack[0], pack[1], (byte)0x00, (byte)0x00  // new page data (always need to write full page)
    });
    

    ultralightEV1.enablePasswordProtection(已启用,来自PageNum);

    为了启用密码保护,您需要配置需要密码的第一页(AUTH0,mf0ul 11/mf0ul 21的第0x10页的字节3 ),并且您需要配置保护模式(mf0ul 11/mf0ul 21的第0x11页的字节0的PROT位7)。

    您通常首先读取(READ (0x30) 命令)这些页面的旧值,更新受影响的位和字节,然后将新值写入标记:

    int fromPageNum = 4;
    boolean enableProtection = true;
    boolean enableReadProtection = true;
    byte[] response = nfc.transceive(new byte[] {
        (byte) 0x30, // READ
        (byte)(cfgOffset & 0x0FF)  // page address
    });
    if ((response != null) && (response.length >= 16)) {
        // success
        // NOTE that READ will return *4 pages* starting at page address
        byte auth0 = (byte)0xFF;
        if (enableProtection || enableReadProtection) {
            auth0 = (byte)(fromPageNum & 0x0FF);
        }
        byte[] writeResponse = nfc.transceive(new byte[] {
            (byte) 0xA2, // WRITE
            (byte)((cfgOffset + 0) & 0x0FF),              // page address
            response[0], response[1], response[2], auth0  // new page data
        });
        byte access = (byte)(response[4] & 0x07F);
        if (enableProtection && enableReadProtection) {
            access |= (byte)0x80;
        }
        byte[] writeResponse = nfc.transceive(new byte[] {
            (byte) 0xA2, // WRITE
            (byte)((cfgOffset + 1) & 0x0FF),                // page address
            access, response[5], response[6], response[7],  // new page data
        });
    }
    
     类似资料:
    • 我有ntag213,使用react-native-nfc-Manager和andriod一起使用,在我的标签留档https://www.nxp.com/docs/en/data-sheet/NTAG213_215_216.pdf我知道首先我需要验证命令0x1B0x2B和我的密码:0xFF1FFFFF

    • 问题内容: 如何使用jQuery设置和取消设置Cookie,例如创建一个名为的Cookie 并将其值设置为? 问题答案: 2019年4月更新 Cookie的读取/操作不需要jQuery,因此请不要使用下面的原始答案。 转到https://github.com/js-cookie/js-cookie,然后在其中使用不依赖jQuery的库。 基本示例: 有关详细信息,请参见github上的文档。 参见

    • 问题内容: 如何在Java中的long的特定位置设置/取消设置位? 例如, 我想在位置2设置位,在位置3取消设置位,因此相应的long将是, 有人可以帮我怎么做吗? 问题答案: 要设置一点,请使用: 擦除一下使用: 切换一下用途: 请注意,我使用0b?。您也可以使用任何整数,例如: 但是,这使得更难知道正在更改哪个位。 使用二进制可让您查看将要设置/擦除/切换的确切位。 要动态设置位,请使用: 将

    • 问题内容: 是否可以在锚标签上设置像素的宽度和高度?我希望锚标签具有背景图像,同时将文本保留在锚内。 问题答案: 您需要制作锚点或,然后它将接受宽度和高度值。

    • 那我试试这个 但是我有 如何设置xlabel和ylabel,然后将新图像另存为文件?

    • 刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。 xticks() 和 ytic