O javax.crypto.Cipher funciona de maneira diferente desde o Android 6 Marshmallow

Eu tenho usado com sucesso javax.crypto.Cipher.getInstance ("DESede / CBC / NoPadding") para autenticar com cartões DESFire no Android (seguindo o exemplo aqui:https://stackoverflow.com/a/14160507/2095694) Ele está funcionando em vários dispositivos do Android 4 ao 5, mas parou de funcionar no meu Nexus 7 atualizado para o 6 Marshmallow (e 6.0.1). Ele estava trabalhando no mesmo dispositivo antes da atualização.

Parece que o Cipher está funcionando de maneira diferente, fornecendo resultados diferentes para a mesma chave e dados. Executando o seguinte código ...

public static void testCipher() throws Exception
{
    byte[] KEY =
            new byte[]{
                    (byte) 0x0C, (byte) 0x09, (byte) 0x03, (byte) 0x0E,
                    (byte) 0x05, (byte) 0x0A, (byte) 0x0D, (byte) 0x02,
                    (byte) 0x03, (byte) 0x0A, (byte) 0x09, (byte) 0x0B,
                    (byte) 0x06, (byte) 0x10, (byte) 0x04, (byte) 0x10
            };

    byte[] DATA =
            new byte[]{
                    (byte) 0x29, (byte) 0xDA, (byte) 0xC0, (byte) 0xC4,
                    (byte) 0xB8, (byte) 0x47, (byte) 0x13, (byte) 0xA2};

    byte[] newByte8 = new byte[8]; //Zeroes

    android.util.Log.d("TEST", "KEY : " + bin2hex(KEY));
    android.util.Log.d("TEST", "DATA: " + bin2hex(DATA));
    android.util.Log.d("TEST", "IVPS: " + bin2hex(newByte8));
    android.util.Log.d("TEST", "----");

    javax.crypto.Cipher cipher =
            javax.crypto.Cipher.getInstance("DESede/CBC/NoPadding");

    cipher.init(
            Cipher.DECRYPT_MODE,
            new javax.crypto.spec.SecretKeySpec(KEY, "DESede"),
            new javax.crypto.spec.IvParameterSpec(newByte8));

    byte[] result = cipher.doFinal(DATA);

    android.util.Log.d("TEST", "RSLT: " + bin2hex(result));
}

public static String bin2hex(byte[] data) {
    return String.format("%0" + (data.length * 2) + "X", new java.math.BigInteger(1, data));
}

... fornece a seguinte saída:

KEY : 0C09030E050A0D02030A090B06100410
DATA: 29DAC0C4B84713A2
IVPS: 0000000000000000
----
RSLT: 47BC415065B8155E

O valor normal, como deveria ser, sempre funcionou e o cartão acaba sendo autenticado corretamente, por isso está fazendo da maneira que o cartão espera. Como já disse, tentei em vários dispositivos (Android 4 e 5) e eles deram o mesmo resultado.

Mas no meu Nexus 7 agora com Marshmallow, recebo outra coisa (e a autenticação acaba falhando)

RSLT: F3ADA5969FA9369C 

Alguma coisa mudou nas bibliotecas?

questionAnswers(2)

yourAnswerToTheQuestion