Mifare Ultralight: блокировка определенных страниц

По этой ссылке я получил ссылку ( Mifare Ultralight C Lock), чтобы сделать все страницы тега Mifare Ultralight доступными только для чтения.

Я могу успешно написать сообщение о теге Mifare Ultralight на Android. Теперь я хочу заблокировать страницы с 4 по 7 (или любую конкретную страницу). Приведенная выше ссылка показывает только как заблокировать все страницы. Как я могу заблокировать определенные страницы?

Этот код блокирует все страницы:

mifare.transceive(new byte[] {
    (byte)0xA2,  /* CMD = WRITE */
    (byte)0x02,  /* PAGE = 2    */
    (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF  /* DATA = lock pages 3..15*/
});

public static boolean writeOnMifareUltralight(Context _context, Tag tag,String pageData, int i) {
    byte[]result;
    MifareUltralight mifare = null;
    try {

        mifare = MifareUltralight.get(tag);
        mifare.connect();
        mifare.writePage(i, pageData.getBytes(Charset.forName("US-ASCII")));

        mifare.transceive(new byte[] {
            (byte)0xA2,  /* CMD = WRITE */
            (byte)0x02,  /* PAGE = 2    */
            (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF/* DATA = lock pages 3..15*/
        });
    } catch (Exception ex) {
        ex.printStackTrace();
        Log.d("mtw", ex.getMessage());
        // return false;
    } finally {
        try {
            mifare.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    return true;
}

1 ответ

Байты блокировки MIFARE Ultralight используют один бит для блокировки одного блока. Кроме того, они содержат 3 блокирующих бита, которые управляют состоянием блокировки самих байтов блокировки.

  • Байт 2 (на странице 2): биты 3-7 являются битами блокировки для страниц 3-7. Таким образом, бит 3 блокирует страницу 3, бит 4 блокирует страницу 4 и т. Д. Три младших бита являются битами блокировки блока. Бит 0 блокирует бит блокировки для страницы 3, бит 1 блокирует биты блокировки для страниц 4-9, а бит 2 блокирует биты блокировки для страниц 10-15.

  • Байт 3 (на странице 2): биты 0-7 являются битами блокировки для страниц 8-15. Таким образом, бит 0 блокирует страницу 8, бит 1 блокирует страницу 9 и т. Д.

Так, например, чтобы заблокировать страницы 4-7, вы можете использовать следующую команду:

mifare.transceive(new byte[] {
    (byte)0xA2,  /* CMD = WRITE */
    (byte)0x02,  /* PAGE = 2    */
    (byte)0x00, (byte)0x00, (byte)0xF0, (byte)0x00 /* DATA = lock pages 4..7*/
});

Обратите внимание, что вместо mifare.transceive() Вы также можете просто использовать mifare.writePage():

mifare.writePage(2, new byte[] {
    (byte)0x00, (byte)0x00, (byte)0xF0, (byte)0x00 /* DATA = lock pages 4..7*/
});

Имейте в виду, что биты блокировки программируются один раз. Следовательно, как только бит блокировки установлен в логическое 1 (т. Е. Заблокирован), он не может быть обращен в логический 0 (т. Е. Разблокирован).

Это также позволяет вам установить один бит блокировки за раз. Например, чтобы установить страницу i LOCKED (где 3 <= i <= 15!!!), что-то вроде этого должно работать:

mifare.transceive(new byte[] {
    (byte)0xA2,  /* CMD = WRITE */
    (byte)0x02,  /* PAGE = 2    */
    (byte)0x00, (byte)0x00, (byte)((1<<i) & 0x0FF), (byte)(((1<<i)>>>8) & 0x0FF)
});
Другие вопросы по тегам