2015-12-15 19 views
5

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 

は図書館で変更何かを持っていますか?

+1

暗号化ライブラリにおけるいくつかの変更があります。退屈なSSLのセクションhttp://developer.android.com/about/versions/marshmallow/android-6.0-changes.htmlを参照してください。しかし、javax.cryptoパッケージへの影響については不明です。 –

+1

私はまったく同じ問題を抱えています。暗号パッケージのアップデートに基づいていくつか試してみましたが、まだ何もできませんでした。 3DES(DESede/CBC/NoPadding)のための独立したコードを実装(移植)することにしました。問題がマシュマロポートにあることを確認しました。これは、ユーザーのデバイス上のMarshmallow(APIレベル23)の更新により、ユーザーが壊れてしまい、スケーリングが速くなっています。 – Rodrigo

+0

両方のおかげです。 @Rodrigo私の答えがあなたのためにも働くかどうかテストできますか? – Nublodeveloper

答えて

6

彼らはマーシュマローのデフォルトプロバイダを変更したようです。

シンプル

cipher.getProvider().getName(); 

ショーの前に(私は仮定はBouncyCastle)それは "BC" だったマシュマロのための "AndroidOpenSSL"。他のgetInstanceのオーバーロードを使用して

...

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

は...私はマシュマロと私のネクサスに期待される結果を提供します。

+0

素晴らしい発見! DESede/CBC/PKCS7Paddingを使用しているときに私の問題を解決しました。私はCipherを使用している別のプロジェクトを持っていて、プロバイダを指定しなくてもうまくいきます。アルゴリズムはPBEWithMD5AndDESです。 – GuilhE

+1

@GuilhE申し訳ありませんが、私は明らかに仮定することができます、そのアルゴリズムのデフォルトプロバイダは変更されていないか、まったく同じように動作します。 – Nublodeveloper

1

発行アンドロイドバグがあります: https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=triple%20des&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened&groupby=&sort=&id=189292

はあなたにも、あなたに以下のようにlenを24バイトの鍵を変更することで、あなたの問題を解決することができます:

MessageDigest md = MessageDigest.getInstance("MD5"); 
seed_key = md.digest(new String(key).getBytes()); 

if (seed_key.length == 16) { 
    byte[] tempkey = new byte[24]; 
    System.arraycopy(seed_key, 0, tempkey, 0, 16); 
    System.arraycopy(seed_key, 0, tempkey, 16, 8); 

    seed_key = tempkey; 
} 
SecretKeySpec keySpec = new SecretKeySpec(seed_key, "DESede"); 
nCipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); 
byte[] IVector = new byte[] { 27, 9, 45, 27, 0, 72, (byte) 171, 54 }; 
IvParameterSpec iv = new IvParameterSpec(IVector); 
nCipher.init(Cipher.ENCRYPT_MODE, keySpec, iv); 

byte[] cipherbyte = nCipher.doFinal(data.getBytes()); 
encodeTxt = new String(Base64.encodeBase64(cipherbyte)); 
+0

良い発見!私はちょうどこれをテストし、それも動作します。私もmarshmallowの "BC"という24バイトのlenフィックスをテストしたので、pre-marshmallowも正しく動作すると思います。 – Nublodeveloper

関連する問題