Java 使用apktool重新编译后,GCM中的Mac签入失败
我有一个android应用程序,它使用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
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;i bArr[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