首页 > 解决方案 > 使用 apktool 重新编译后 Mac 检查 GCM 失败

问题描述

BouncyCastle我有一个用于加密和解密的 android 应用程序。它有一个数据库,其中有一些用 BouncyCastle 加密的字符串,我需要对其进行反编译并从中获得一些解密,我正在这样做apktool,它使我成功反编译,我正在更改一些代码并添加日志.d 用于解密它,然后在编译之后,它成功编译,现在当我使用它时,我想尝试从中获取日志以知道那个字符串是什么,它说mac check in GCM failed。我应该怎么办?

在该应用程序的代码下方:

要解密的文本:

IBbdPw==

用于加密:

public static int KeyBitSize = 16;
public static int MacBitSize = 32;
public static int NonceBitSize = 16;
public static String encrypt(String str, byte[] bArr, byte[] bArr2) {
    String str2 = "";
    try {
        byte[] bytes = str.getBytes("UTF-8");
        GCMBlockCipher gCMBlockCipher = new GCMBlockCipher(new AESFastEngine());
        gCMBlockCipher.init(true, new AEADParameters(new KeyParameter(bArr), MacBitSize, bArr2, null));
        byte[] bArr3 = new byte[gCMBlockCipher.getOutputSize(bytes.length)];
        gCMBlockCipher.doFinal(bArr3, gCMBlockCipher.processBytes(bytes, 0, bytes.length, bArr3, 0));
        return Base64.encodeToString(bArr3, 0);
    } catch (UnsupportedEncodingException | IllegalArgumentException | IllegalStateException | DataLengthException | InvalidCipherTextException e) {
        System.out.println(e.getMessage());
        return str2;
    }
}

解密:

public static String decrypt(String str, byte[] bArr, byte[] bArr2) {
    String str2 = "";
    try {
        byte[] decode = Base64.decode(str, 0);
        GCMBlockCipher gCMBlockCipher = new GCMBlockCipher(new AESFastEngine());
        gCMBlockCipher.init(false, new AEADParameters(new KeyParameter(bArr), MacBitSize, bArr2, null));
        byte[] bArr3 = new byte[gCMBlockCipher.getOutputSize(decode.length)];
        gCMBlockCipher.doFinal(bArr3, gCMBlockCipher.processBytes(decode, 0, decode.length, bArr3, 0));
        return new String(bArr3, Charset.forName("UTF-8"));
    } catch (IllegalArgumentException | IllegalStateException | DataLengthException | InvalidCipherTextException e) {
        System.out.println(e.getMessage());
        return str2;
    }
}

更新:

它使用如下代码进行解密:

byte[] HexToByte(String str) {
        int length = str.length();
        byte[] bArr = new byte[(length / 2)];
        for (int i = 0; i < length; i += 2) {
            bArr[i / 2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) + Character.digit(str.charAt(i + 1), 16));
        }
        return bArr;
    }

String arg_1="IBbdPw==";
String arg_2="C6704D668D64DD012A86858C36F35D46F3";
String arg_3="58EB2DB3E1063FC93A";
decrypt(arg_1, HexToByte(arg_2.substring(0, 32)), HexToByte(arg_3.substring(0, 16)));

而 arg_2 在应用程序通过其签名密钥运行时发生变化

标签: javaandroidencryptionbouncycastleapktool

解决方案


推荐阅读