Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用apktool重新编译后,GCM中的Mac签入失败_Java_Android_Encryption_Bouncycastle_Apktool - Fatal编程技术网

Java 使用apktool重新编译后,GCM中的Mac签入失败

Java 使用apktool重新编译后,GCM中的Mac签入失败,java,android,encryption,bouncycastle,apktool,Java,Android,Encryption,Bouncycastle,Apktool,我有一个android应用程序,它使用BouncyCastle进行加密和解密。它有一个数据库,里面有一些字符串,用BouncyCastle加密,我需要对其进行反编译并从中得到一些解密,我使用apktool进行反编译,它给了我成功的反编译,我更改了一些代码并向其中添加log.d以用于解密,然后在编译之后,它成功编译,现在,当我使用它时,我想尝试从中获取日志,以了解该字符串是什么,它显示mac签入GCM失败。我该怎么办 以下是该应用程序的代码: 要解密的文本: byte[] HexToByte(St

我有一个android应用程序,它使用
BouncyCastle
进行加密和解密。它有一个数据库,里面有一些字符串,用BouncyCastle加密,我需要对其进行反编译并从中得到一些解密,我使用
apktool
进行反编译,它给了我成功的反编译,我更改了一些代码并向其中添加log.d以用于解密,然后在编译之后,它成功编译,现在,当我使用它时,我想尝试从中获取日志,以了解该字符串是什么,它显示
mac签入GCM失败
。我该怎么办

以下是该应用程序的代码:

要解密的文本:

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)));
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)));
byte[]十六进制字节(字符串str){
int length=str.length();
字节[]巴尔=新字节[(长度/2)];
对于(int i=0;ibArr[i/2]=(字节)(字符数字(str.charAt(i),16)你想要解密的密文不可能是用这些参数产生的,因为它的长度只有32位。请你解释一下,好吗?有没有办法找到
barr
和barr2?我都有,但是
barr
随着应用程序签名密钥的变化而变化,我想是因为这个原因,有没有办法找到
barr
barr
=
C6704D668D64DD012A86858C36F35D46
bArr2
=
58EB2DB3E1063FC9
但是
barr
正在使用符号键进行更改。因此库。@JamesReinstateMonicaPolkI必须重新解释您的常量,使其有意义。唯一合理的含义是键大小为16字节,而不是nce大小是16字节,mac大小实际上是32位。
IBbdPw==
,当base-64解码时,只有32位,但即使没有明文(在这种情况下,这将是AES-GMAC)应该是20字节,因此20字节是有效密文的最小长度。16字节nonce+4字节MAC=20字节。啊,对不起,我更新了我的问题,我添加了如何解密@JamesReinstateMonicaPolk