Наконец, я решил это решение
Для этого нам нужно изменить биты доступа в каждом секторе в четвертом блоке
Например, в секторе 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)
{
}