Ich habe erfolgreich javax.crypto.Cipher.getInstance ("DESede/CBC/NoPadding") verwendet, um mit DESFire-Karten auf Android zu authentifizieren (folgendes Beispiel hier: https://stackoverflow.com/a/14160507/2095694). Es hat auf mehreren Geräten von Android 4 bis 5 funktioniert, aber auf meinem Nexus 7 auf 6 Marshmallow (und 6.0.1) aktualisiert funktioniert nicht mehr. Es hatte vor der Aktualisierung auf demselben Gerät funktioniert.javax.crypto.Cipher funktioniert anders seit Android 6 Marshmallow
Es scheint, dass Cipher anders arbeitet und unterschiedliche Ergebnisse für denselben Schlüssel und dieselben Daten liefert. Das Ausführen des folgenden Code ...
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));
}
... gibt mir die folgende Ausgabe:
KEY : 0C09030E050A0D02030A090B06100410
DATA: 29DAC0C4B84713A2
IVPS: 0000000000000000
----
RSLT: 47BC415065B8155E
Normalwert, was soll es sein, immer gearbeitet und Karten landet korrekt authentifiziert, so es tut So wie die Karte es erwartet. Wie gesagt habe ich mehrere Geräte (Android 4 und 5) ausprobiert und sie geben das gleiche Ergebnis.
Aber auf meinem Nexus 7 jetzt mit Eibisch bekomme ich etwas anderes (und die Authentifizierung endet versagt)
RSLT: F3ADA5969FA9369C
hat sich in den Bibliotheken etwas verändert?
einige Änderungen in Verschlüsselungsbibliotheken Es gibt keine. Siehe Langweilige SSL-Sektion http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html Aber ich bin mir nicht sicher über die Auswirkungen auf das Paket javax.crypto. –
Ich habe genau das gleiche Problem. Ich habe ein paar Dinge versucht, die auf dem Crypto-Paket-Update basieren, aber es hat noch nichts funktioniert. entschieden, einen unabhängigen Code für 3DES (DESede/CBC/NoPadding) zu implementieren (portieren), damit es funktioniert. Ich bestätigte, dass das Problem im Marshmallow-Port liegt. Dadurch werden meine Benutzer durch Marshmallow (API Level 23) -Updates auf Benutzergeräten schnell kaputt gemacht und skaliert. – Rodrigo
Danke an euch beide. @Rodrigo Könntest du testen, ob meine Antwort auch für dich funktioniert? – Nublodeveloper