Расшифровка аутентификации 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»


person Ionut Bogdan    schedule 08.07.2012    source источник


Ответы (1)


Если ваш главный ключ bytes должен состоять из нулей, то это неверно:

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

Это даст вам текстовую форму «00000000000000000» в кодировке платформы по умолчанию — скорее всего, { 0x30, 0x30, 0x30 ... }

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

byte[] masterKeyBytes = new byte[16];

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

По общему признанию, это все еще не дает вам результат, который вы ищете... но он использует ключ "все нули"/IV.

person Jon Skeet    schedule 08.07.2012
comment
Оно работает! Я получил тот же результат, и теперь я могу аутентифицироваться с помощью карты desfire !!! - person Ionut Bogdan; 08.07.2012
comment
@IonutBogdan: Хм... когда я пробую этот код, но с действительным ключом /IV, я получаю первый байт как 136, то есть 0x88, а не 0xA4. Тем не менее, если вы счастливы :) - person Jon Skeet; 08.07.2012