2017-12-14 19 views
0

文字列入力を暗号化するこのコードがあります。他のデバイスで同じ入力を使って暗号化した場合、8.1より低い値になります。しかし、私が8.1のデバイスを試してみると、まったく別の文字列が得られます。 例外がスローされません。私はKeyGenerator:AESでAndroid 8.1の暗号化アップデートを見つけました。どのように私は他のデバイスと同じ値を生成するために修正することができますOSの下位8.1?Android CipherでAndroid 8.1を暗号化

public static String cryptAESGungHo(String input) 
{ 
    byte[] gh_key = getKeyGungho("gh_key").getBytes(); 
    byte[] gh_iv = getKeyGungho("gh_iv").getBytes(); 
    IvParameterSpec ivSpecs = new IvParameterSpec(gh_iv); 
    byte[] crypted = null; 
    try{ 
     SecretKeySpec skey = new SecretKeySpec(gh_key, "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, skey, ivSpecs); 
     try 
     { 
    crypted = cipher.doFinal(input.getBytes("UTF-16")); 
     } 
     catch(Exception e) 
     {} 
    }catch(Exception e){ 
    } 
    String cr= new String(crypted); 
    return cr; 
} 
+0

復号化に128ビットまたは256ビットを使用していますか? これを1.1.3にアップデートして、実装を変更して256ビットを使用して暗号化すると、問題なく解読できました。 OSではなくライブラリに問題があるようです。 – Dilip

+0

私は128ビットを使用しています。私はまだそれを解読することができます。しかし、文字列の戻り値は他のOSと同じではありません –

+0

これを256ビットに変更してもう一度やり直してください... – Dilip

答えて

0

UTF-16に変更してみてくださいUTF-16LEまたはUTF-16BEをご確認ください。

crypted = cipher.doFinal(input.getBytes("UTF-16LE")); 

あなたは他のAndroidのOSの場合と同じであるかどうかのAndroid 8.1.0の暗号入力を確認するには

byte[] data = str.getBytes("UTF-16LE"); 
Log.i("api", Arrays.toString(data)); 

を使用することができます。

+0

これはUTF-16LEで動作します。どうもありがとうございました。 –

0

この行を変更し、

から

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

Cipher cipher = Cipher.getInstance("AES"); 
+0

まだ起こっています。 OS 8.1以降では異なる値が返されます。 @@ –

+0

あなたはこのURLを考えて行くことができます。https://stackoverflow.com/questions/6788018/android-encryption-decryption-with-aes –