Autentificación descifrado DESFire

Actualmente estoy trabajando con tarjetas sin contacto DESFire EV1. Estoy tratando de descifrar un DES / CBC cifrado random_b con clave maestra: “00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00”.

Estoy usando este código:

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); 

pero este código no descifra correctamente. Obtengo este resultado no válido: “4B 9D 5A 91 AE 93 F8 ED” el correcto es: “A4 2F 3E 84 2C 5A 29 68”

Si sus bytes de clave maestra están destinados a ser todos ceros, entonces esto es incorrecto:

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

Eso le dará la forma de texto codificado de “0000000000000000” en la encoding predeterminada de la plataforma – muy probablemente { 0x30, 0x30, 0x30 ... }

Sin embargo, obtener una matriz llena de ceros es simple:

 byte[] masterKeyBytes = new byte[16]; 

Lo mismo ocurre con la IV (con la longitud adecuada, por supuesto).

Eso aún no le da el resultado que está buscando, es cierto … pero está usando una tecla de “todos ceros” / IV.