Utilizzo correttamente javax.crypto.Cipher.getInstance ("DESede/CBC/NoPadding") per l'autenticazione con le schede DESFire su Android (nell'esempio riportato di seguito: https://stackoverflow.com/a/14160507/2095694). Sta funzionando su diversi dispositivi da Android 4 a 5, ma ha smesso di funzionare sul mio Nexus 7 aggiornato a 6 Marshmallow (e 6.0.1). Stava lavorando sullo stesso dispositivo prima dell'aggiornamento.javax.crypto.Cipher funziona in modo diverso da Android 6 Marshmallow
Sembra che Cipher stia funzionando in modo diverso, dando risultati diversi per la stessa chiave e dati. L'esecuzione del codice seguente ...
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));
}
... mi dà il seguente risultato:
KEY : 0C09030E050A0D02030A090B06100410
DATA: 29DAC0C4B84713A2
IVPS: 0000000000000000
----
RSLT: 47BC415065B8155E
Il valore normale, quello che dovrebbe essere, ha sempre lavorato e una carta finisce per autenticare correttamente, in modo che sta facendo è il modo in cui la carta si aspetta. Come detto ho provato su diversi dispositivi (Android 4 e 5) e danno lo stesso risultato.
Ma sul mio Nexus 7 ora con Marshmallow ottengo qualcosa di diverso (e l'autenticazione finisce per non aver)
RSLT: F3ADA5969FA9369C
ha qualcosa cambiato nelle biblioteche?
Ci sono alcuni cambiamenti nelle librerie crittografiche. Vedere la sezione Boring SSL http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html Ma non si è sicuri sull'impatto sul pacchetto javax.crypto. –
Sto avendo lo stesso identico problema. Ho provato alcune cose sulla base dell'aggiornamento del pacchetto crittografico, ma non ha funzionato ancora. ha deciso di implementare (port) un codice indipendente per 3DES (DESede/CBC/NoPadding) per farlo funzionare. Ho convalidato il problema è nella porta Marshmallow. Questo sta violando i miei utenti e scalando rapidamente a causa degli aggiornamenti di Marshmallow (API Livello 23) sui dispositivi degli utenti. – Rodrigo
Grazie a tutti e due. @Rodrigo Potresti provare se la mia risposta funziona anche per te? – Nublodeveloper