So entschlüsseln Sie die erste von Mifare Desfire EV1 gesendete Nachricht

Hat jemand eine Ahnung, wie man die erste von der Karte gesendete Nachricht entschlüsselt? Ich meine nach der Authentifizierung Erfolg und dann senden Sie einen Befehl (zum Beispiel 0x51 (GetRealTagUID). Es gibt 00 + random32bits (immer anders). Ich versuche, es mit zu entschlüsseln:

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

Und mit decrypt aufrufen (sessionKey, response, iv)

IV = alle Nullen (16 Bytes)

response = dass 32randombits nach dem 0x51 Befehl (nur die zwei Nullen entfernt)

Jemand hat mir gesagt, dass sich die IV nach dem ersten gesendeten Befehl ändert (0x51). Wie kann die richtige IV zum Entschlüsseln dieser Antwort generiert werden? Ich denke, dass alle Nullen falsch sind, weil die entschlüsselte Nachricht immer unterschiedlich ist und mit der gleichen Karte immer gleich sein sollte.

-BEARBEITEN-

Nach dem Anwenden Ihrer Anweisungen (Michael Roland) besteht die entschlüsselte Antwort immer noch aus zufälligen Bits. Hier ist mein Code (ich glaube, ich mache etwas falsch):

            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-

Es werden immer wieder andere Werte zurückgegeben. Ich denke, das Problem könnte hier liegen:

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

Welche IV soll beim Erstellen der neuen IV zum Entschlüsseln der Antwort verwendet werden? Es sind alles Nullen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage