Cómo descifrar el primer mensaje enviado desde Mifare Desfire EV1

¿Alguien tiene una idea de cómo descifrar el primer mensaje enviado desde la tarjeta? Me refiero después del éxito de la autenticación y luego envía un comando (por ejemplo, 0x51 (GetRealTagUID). Devuelve 00 + random32bits (siempre diferente). Intento descifrarlo con:

        private byte[] decrypt(byte[] raw, byte[] encrypted, byte[] iv)
            throws Exception {
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        return decrypted;
    }

Y llamándolo con descifrar (sessionKey, respuesta, iv)

IV = todos los ceros (16 bytes)

respuesta = que 32randombits después del comando 0x51 (acaba de eliminar los dos ceros)

Alguien me dijo que la IV cambia después del primer comando enviado (0x51). ¿Cómo generar el IV correcto para descifrar esa respuesta? Creo que todos los ceros están equivocados, porque el mensaje descifrado es siempre diferente y debería ser siempre el mismo con la misma tarjeta.

-EDITAR-

Después de aplicar sus instrucciones (Michael Roland), la respuesta desencriptada es solo bits aleatorios. Aquí está mi código (creo que estoy haciendo algo mal):

            byte[] x = encrypt(sessionKey, iv, iv);

            byte[] rx = rotateBitsLeft(x);

            if ((rx[15] & 0x01) == 0x01)
                rx[15] = (byte) (rx[15] ^ 0x87);

            if ((rx[15] & 0x01) == 0x00)
                rx[15] = (byte) (rx[15] ^ 0x01);

            byte[] crc_k1 = rx;

            byte[] rrx = rotateBitsLeft(rx);

            if ((rrx[15] & 0x01) == 0x01)
                rrx[15] = (byte) (rrx[15] ^ 0x87);

            if ((rrx[15] & 0x01) == 0x00)
                rrx[15] = (byte) (rrx[15] ^ 0x01);

            byte[] crc_k2 = rrx;

            byte[] command = { (byte) 0x51, (byte) 0x80, (byte) 0x00,
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                    (byte) 0x00 };

            for (int i = 0; i < 16; i++){
                command[i] = (byte) (command[i] ^ crc_k2[i]);
            }

            byte[] iv2 = encrypt(sessionKey, command, iv);

            byte[] RealUID = decrypt(sessionKey, ReadDataParsed, iv2);

            Log.e("RealUID", ByteArrayToHexString(RealUID));

-EDIT3-

Sigo devolviendo siempre valores diferentes. Creo que el problema podría estar aquí:

byte[] iv2 = encrypt(sessionKey, command, iv);

¿Qué IV usar al crear el nuevo IV para descifrar la respuesta? Todo es ceros allí.

Respuestas a la pregunta(2)

Su respuesta a la pregunta