Расшифровка аутентификации DESFire

В настоящее время я работаю с бесконтактными картами DESFire EV1. Я пытаюсь расшифровать DES / CBC, зашифрованный random_b, с помощью мастер-ключа: "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00".

Я использую этот код:

byte[] encipheredCodeRandomB = { (byte)0xEA ,(byte)0x18 ,(byte)0xDE ,(byte)0xFF
     ,(byte)0x52 ,(byte)0x0E,(byte)0xCD, (byte) 90};
byte[] masterKeyBytes = "0000000000000000".getBytes();
byte[] ivBytes = "00000000".getBytes();

DESKeySpec desKeySpec = new DESKeySpec(masterKeyBytes);  
SecretKeyFactory desKeyFact = SecretKeyFactory.getInstance("DES");
SecretKey s = desKeyFact.generateSecret(desKeySpec);
aliceCipher = Cipher.getInstance("DES/CBC/NoPadding");
aliceCipher.init(Cipher.DECRYPT_MODE, s, new IvParameterSpec(ivBytes));

byte[] decipheredCodeRandomB = aliceCipher.doFinal(encipheredCodeRandomB);

но этот код не расшифровывается правильно. Я получаю этот недействительный результат: "4B 9D 5A 91 AE 93 F8 ED" правильный вариант: "A4 2F 3E 84 2C 5A 29 68";

Ответы на вопрос(1)

Решение Вопроса

Если ваш мастер-ключbytes подразумеваются все нули, тогда это неверно:

byte[] masterKeyBytes = "0000000000000000".getBytes();

Вы получите текстовую форму & quot; 0000000000000000 & quot; в кодировке платформы по умолчанию - скорее всего{ 0x30, 0x30, 0x30 ... }

Получить массив, полный нулей, очень просто:

byte[] masterKeyBytes = new byte[16];

То же самое для IV (с соответствующей длиной, конечно).

Это все еще не дает вам результат, который вы ищете, по общему признанию ... но этоis используя «все нули»; ключ / IV.

 08 июл. 2012 г., 21:33
@IonutBogdan: Хм ... когда я пробую этот код, но с & quot; действительным & quot; ключ / IV, я получаю первый байт как 136, то есть 0x88, а не 0xA4. Тем не менее, если вы счастливы :)
 Ionut Bogdan08 июл. 2012 г., 21:30
Большое спасибо!!!! Это была проблема!
 Ionut Bogdan08 июл. 2012 г., 21:31
Оно работает! Я получил тот же результат, и теперь я могу пройти проверку подлинности с картой desfire !!!

Ваш ответ на вопрос