java - 使用 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 在应用程序通过其签名密钥运行时发生变化
解决方案
推荐阅读
- sql - 如何在 SAS 中通过 SQL 传递,创建视图或表
- firefox - 如何解决在 firefox 上运行 testcafe test1.js 时浏览器断开连接错误:使用 SUSE 无头
- java - windows server 2008 at org.opencv.imgproc.Imgproc.erode_1(Native Method)
- php - 如果我需要刀片视图数据中来自 foreach 的 $row,我如何在 Laravel 中声明一个 var
- azure - 不为入口资源创建 DNS 记录
- angular - 如何将多个属性映射到Angular 6中的数组?
- python - ImportError:没有名为 pg8000 的模块
- greenplum - 列“foo”的类型为 test12.test_type[],但表达式的类型为 record[]
- mongodb - 是否可以获取数组的最后一个元素并将其推入另一个数组(撤消 - 重做)?
- singularity-container - 奇点容器:如何在设置中对源代码进行重大更改?