首页 > 解决方案 > 如何在 Android 上从 Facebook 解密数据?AES/GCM

问题描述

新的更新后,Facebook 会加密活动数据,这些数据可以通过 InstallRefer 获得。如何在 Android 上解密这些数据?我无法弄清楚我做错了什么?

    int TAG_LENGTH = 16;
    String decrypted_text;
    Cipher cipher = null;
    byte[] decodeData;
    String decode_key = "1979b253b2672502d14193769a157fa7fe909c44386ed03019804d8e8e6d6894";
    String s = "a465493b52a7eb721cf7eafdd16fddbe66431b6c266f1a357ff1c0f6910717ca5ed66440021588436001c13f562f906e78401498a3bbde775cb603cf16bff228fa2ddc1145b64dcd581a2703892ed78da4f36fae9aa7b3824a277b6df0847215056862f2975c79bb3e23471dcf361d53f652d4edb41d6e30f8ab94615742e88706b3a3f337f6c0e52e511ff7ed336d4baa23351552f1b6eb168765880382ff6788113414ba51d28f50897cb74ad81cd4adc0c0073c960791e2be172f2bc11adbfb3bb4b1cb2dfd7b7554f9f404337504d9e1f21e1a68191243ede10bfdc63a4a0aafd0322147efba9e9c269188ebaf5f297ba89f23a8dc66ee9a0b59c13caccf4518032a6d27ea0949cd3fd2f09f4551ef58b4aaf8c6981feac1ab2df686d7bde30be0e5cf1d259424e3268b3e222deef951bd43b688fd9d18266f084df972781d7318eccdda5e31643446de7e460b03c05c2d91682f9aaca8074416a5fd6b221afc6dbd61ccd2f549a2a8844783d2616ff75037478706c300d4e9944f623022b377bfd5bb2fcdac86e9a58dbeadca5dc5a746c839dd38c66fd6abb3de8a3bca0a4e4b416c1fd1e7c13799317e924ddde1f88cae0d5598be1d76ccb9931266cad07cd7a72df756830cdbadb95bed5c505535c62d87adcdf82338c29a0cc82b56bc9fe60d01af4de65e189d4b4ddc2c4cb755ba4e17f4261b72d14a";
    byte[] keyBytes = new byte[0];
    byte[] salt = new byte[8];

    KeySpec spec = new PBEKeySpec(decode_key.toCharArray(), salt, 65536, 128);
    SecretKeyFactory f = null;
    try {
        f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
         keyBytes = f.generateSecret(spec).getEncoded();
    } catch (InvalidKeySpecException e) {
        e.printStackTrace();
    }


    SecretKey secretKey = new SecretKeySpec(keyBytes, "AES_256");

    byte[] byte_data = Base64.decode(s, Base64.DEFAULT);


    try {
        Log.d(TAG,    "   try {");
        cipher = Cipher.getInstance("AES/GCM/NoPadding");
        GCMParameterSpec spec1 = new GCMParameterSpec(16 * 8,cipher.getIV());
        GCMParameterSpec(256, byte_data, 0, 12);
        Log.d(TAG,    "   cipher.init(");
        cipher.init(Cipher.DECRYPT_MODE, secretKey,spec1);
        decodeData = cipher.doFinal(byte_data, 16 , byte_data.length - 16);
        Log.d(TAG,    "   decodeData");
        decrypted_text = new String(decodeData, "UTF-8");
        Log.d(TAG,decrypted_text);

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();

    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    }

我正在将密钥和文本解码为字节数组。然后我将 SecretKey 与 AES_256 一起使用。我不知道 GCMParameterSpe 参数应该是哪一个?如果 TAG = 16,如何正确编写 cipher.doFinal()

标签: javaaes-gcm

解决方案


推荐阅读