2016-09-08 5 views
0

私は、この暗号化機能を持っている上で異なる動作を:AES/CFB/PKCS5Paddingは異なるAndroidのバージョン

String Encrypt(String text, byte[] keyBytes) throws Exception { 
    Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding"); 
    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec("AAAAAAAAAAAAAAAA".getBytes("UTF-8")); 
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); 

    byte[] results = cipher.doFinal(text.getBytes("UTF-8")); 
    return Base64.encodeToString(results, Base64.URL_SAFE); 
} 

ほとんどのAndroidデバイスでは、それが正常に動作します。しかし、いくつかの古いデバイス(注3、LG G2、Android 4.4)では、暗号化されていません。

ここでは、2つのデバイスの比較を示します。注3暗号化に問題があり、Nexus 6は問題ありません。

Note 3 
--------- 
String to encrypt: Hello, world 
Encryption key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 
Encryption result bytes: [108, -63, -66, 117, 62, -78, -108, 22, 12, -128, 119, 22] 
Encryption result Base64: bMG-dT6ylBYMgHcW 

Nexus 6 
--------- 
String to encrypt: Hello, world 
Encryption key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 
Encryption result bytes: [108, -63, -66, 117, 62, -78, -108, 22, 12, -128, 119, 22, 89, -73, -23, 114] 
Encryption result Base64: bMG-dT6ylBYMgHcWWbfpcg== 

これは既知のバグですか?問題を解決するために私ができることは何ですか?

答えて

1

CFB mode of operationはストリーミングモードであり、パディングは不要です。したがって、古いバージョンではPKCS#7のパディング(PKCS#5のパディングと同じ)の要求が無視されたようです。

次の2つのオプションがあります:すべてのバージョンには短縮出力を生成するようCipher.getInstance("AES/CFB/NoPadding")

  • 変更Cipher.getInstance("AES/CFB/PKCS5Padding")を。
  • 実際にパディングが必要な場合は、Cipher.getInstance("AES/CFB/NoPadding")を使用し、パディングを暗号化の前に手動で追加し、解読後にパディングを削除することができます。 padding bytesには、パディングバイトの数を示す値があります。

もちろん、既にバージョンがある場合は、「誤動作」デバイスを使用しているユーザーのエラーに限り、変更する必要はありません。

0

は、ここでは、以前の記事見ました:StackOverflow

をし、すぐにあなたのバッファサイズとどのように変換している疑問を抱い始めました。

Note3とNexus6の両方で、16文字のBase64文字列で同じ結果が表示されますが、Note3の「結果バイト」にはその多くのバイトが含まれていません。

バイト配列が同じ長さで、Note3が実際に欠けている4バイトを切り捨てていることを確認できますか?あるいは、両方を固定長16で作成し、暗号化の後でチェックします。

関連する問題