Можно ли заблокировать команду, защитить клонирование или не стирать другим приложением для карты MIFARE 1k - PullRequest
7 голосов
/ 09 января 2020

Я хочу сделать это, чтобы защитить карту от стирания или клонирования карты. Я читаю много документов Некоторые говорят пользователю четвертый блок, чтобы установить разрешение на чтение и запись ..

Согласно @Michael Roland

Ключи аутентификации и условия доступа для каждого сектора MIFARE карты расположены в последнем блоке этого сектора (сектор трейлера). Вы можете обновить этот блок новыми условиями доступа и ключами аутентификации, используя обычную команду записи.

Трейлер сектора выглядит следующим образом:

+-----------------------------+--------------+----+-----------------------------+
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 |
+-----------------------------+--------------+----+-----------------------------+
|            Key A            | Access Bits  | GP |            Key B            |
|          (6 bytes)          |  (3 bytes)   | B  |          (6 bytes)          |
+-----------------------------+--------------+----+-----------------------------+

Таким образом, биты доступа расположены в байте 6- 8 и выглядят так:

        +-------+-------+-------+-------+-------+-------+-------+-------+
        | Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 6: | nC2_3 | nC2_2 | nC2_1 | nC2_0 | nC1_3 | nC1_2 | nC1_1 | nC1_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 7: |  C1_3 |  C1_2 |  C1_1 |  C1_0 | nC3_3 | nC3_2 | nC3_1 | nC3_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 8: |  C3_3 |  C3_2 |  C3_1 |  C3_0 |  C2_3 |  C2_2 |  C2_1 |  C2_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+

Where nCx_y = not Cx_y and "C1_x, C2_x, C3_x" is the access condition for block x:

C1_3, C2_3, C3_3: sector trailer (block 3 in this sector)
C1_2, C2_2, C3_2: block 2 in this sector
C1_1, C2_1, C3_1: block 1 in this sector
C1_0, C2_0, C3_0: block 0 in this sector

Как я выполняю это в моем текущем проекте

enter image description here

enter image description here

Ответы [ 3 ]

2 голосов
/ 09 января 2020

Вы не можете защитить карту для копирования на себя. (Метод Force Brut легко применить к этому технологу ie)

Что можно сделать, это ha sh всего блока, включая UID, который вы храните на карте. В вашей программе вы просто Сравните данные ha sh с сохраненными значениями ha sh.

Чтобы реализовать свои базовые значения c ha sh в python и сохранить их в блоке, вы можете использовать двойное псевдослучайное значение:

def CRYPT_hashage(data,UID):
    seed(str(data)+str(UID))
    seed(random())
return str(random()).replace("0.","")[:8]

Предотвращает клонирование на другую карту. Пользователь по-прежнему может изменить свою карту. Но вы можете иметь sh данные «конфиденциальных данных» с помощью той же техники.

После этих 2 ценных бумаг, он оставил только технику «клонирования на себя», например: - Вы копируете свои данные - Вы платите (для системы безналичной оплаты) - Вы вставляете свои старые данные на карту)

Единственный способ предотвратить это - сохранить все данные на сервере, используя только UID карты в качестве первичного ключа.

Существует карта, которую вы можете изменить UID.

1 голос
/ 05 февраля 2020

Наконец, я решил это решение

Для этого нам нужно изменить биты доступа в каждом секторе в четвертом блоке

Например, в секторе 5

Так же, как и для сектора 5, нам нужно изменить биты доступа в 23 блоках его

Нам нужно сначала аутентифицировать сектор 5 ...

Ключ по умолчанию -

byte keya[] = { (byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF};

Что 000000000000FF078069FFFFFFFFFFFF

Первый бит 6 предназначен для ключа А, который равен 000000000000 , и последние 6 его для ключа В, который равен FFFFFFFFFFFF шестнадцатеричная строка

FF078069 шестнадцатеричная строка - биты доступа

, поэтому для изменения этого нам нужно реализовать такую ​​реализацию в первый раз, когда нам нужно пройти аутентификацию по умолчанию ключ

  MifareClassic mfc = MifareClassic.get(tag);

        try {
            mfc.connect();
            auth = mfc.authenticateSectorWithKeyA(5, 
 MifareClassic.KEY_DEFAULT);
        if(auth)
        {
         String nkeya = "key123";// 6 length only
                nkeya = toHex(nkeya).toUpperCase();
                nkeya = nkeya.substring(28,40);

                String nkeyb = "key123"; // 6 length only
                nkeyb = toHex(nkeyb).toUpperCase();
                nkeyb = nkeyb.substring(28,40);

                String nkey = nkeya+"FF078069"+nkeyb;
                int len = nkey.length();

                byte[] nkeyab = new BigInteger(nkey, 16).toByteArray();
                // 5 is sector and 5*4+3 is fourth block of sector 5
                mfc.writeBlock((5*4)+3,nkeyab);

}
catch(Execption e)
 {
 }

После успешной защиты от записи Аутентификация по умолчанию не удалась Поэтому нам необходимо пройти аутентификацию с помощью ключа доступа, который мы создаем

try {
 MifareClassic mfc = MifareClassic.get(tag);
 String key = getKeya();

 key = toHex(key).toUpperCase();
  int len = key.length();
   key = key.substring(28,40);
   keya = new BigInteger(key, 16).toByteArray();

  //for key A or for Keb b


            mfc.connect();
            auth = mfc.authenticateSectorWithKeyA(5, keya);
        if(auth)
        {


  byte[] readblock4=    mfc.readBlock(20);

  }
  }
 catch(Exeption e)
 {

 }
1 голос
/ 09 января 2020

Вы можете защитить каждый сектор с помощью ключа A или ключа B.

При этом безопасность карт Mifare Classi c на этом этапе нарушена. Вы не сможете защитить что-либо на самом деле.

...