AndroidのDESFireカードで認証するためにjavax.crypto.Cipher.getInstance( "DESede/CBC/NoPadding")を使用しています(例:https://stackoverflow.com/a/14160507/2095694 )。 Android 4〜5のいくつかのデバイスで動作していましたが、Marshmallow(および6.0.1)に更新されたNexus 7での動作を停止しました。更新する前に同じデバイスで作業していました。Android 6以降で動作しているjavax.crypto.Cipher
Cipherは異なるキーとデータの結果を与えているようです。 ... ...
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));
}
を次のコードを実行すると、私に次のような出力が得られます。それがどうあるべきか
KEY : 0C09030E050A0D02030A090B06100410
DATA: 29DAC0C4B84713A2
IVPS: 0000000000000000
----
RSLT: 47BC415065B8155E
通常の値は、常に働いており、カードが正しく認証終わるので、それはやっていますそれはカードが期待する方法です。私がいくつかのデバイス(Android 4と5)を試してみたところ、同じ結果が得られました。
しかし、私のネクサス7になりましたマシュマロと私は何かを得る(および認証が失敗して終わる)
RSLT: F3ADA5969FA9369C
は図書館で変更何かを持っていますか?
暗号化ライブラリにおけるいくつかの変更があります。退屈なSSLのセクションhttp://developer.android.com/about/versions/marshmallow/android-6.0-changes.htmlを参照してください。しかし、javax.cryptoパッケージへの影響については不明です。 –
私はまったく同じ問題を抱えています。暗号パッケージのアップデートに基づいていくつか試してみましたが、まだ何もできませんでした。 3DES(DESede/CBC/NoPadding)のための独立したコードを実装(移植)することにしました。問題がマシュマロポートにあることを確認しました。これは、ユーザーのデバイス上のMarshmallow(APIレベル23)の更新により、ユーザーが壊れてしまい、スケーリングが速くなっています。 – Rodrigo
両方のおかげです。 @Rodrigo私の答えがあなたのためにも働くかどうかテストできますか? – Nublodeveloper