安卓逆向 -- 自吐算法(3DES和AES)
  KRe60ogUm4le 12天前 17 0

一、3DES源码

String bs= "逆向有你a";
DESedeKeySpec des3key = new DESedeKeySpec(("123456781234567812345678".getBytes(StandardCharsets.UTF_8)));//密钥必须是24个字节
SecretKeyFactory keydes3 = SecretKeyFactory.getInstance("DESede");
SecretKey secretKey3 = keydes3.generateSecret(des3key);
Cipher cipher3des = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher3des.init(1,secretKey3);
byte[] des3res = cipher3des.doFinal(bs.getBytes(StandardCharsets.UTF_8));
System.out.println("3DES加密(字节):"+Arrays.toString(des3res));
System.out.println("3DES加密(Hex):"+bytes2HexString(des3res));
System.out.println("3DES加密(Base64):"+Base64.getEncoder().encodeToString(des3res));
cipher3des.init(2,secretKey3);//初始化解密
byte[] jm3desres = cipher3des.doFinal(Base64.getDecoder().decode("vN3o+PDQ0Yo8y5+InEzpwA==".getBytes(StandardCharsets.UTF_8)));
System.out.println("3DES解密(Base64):"+new String(jm3desres));
byte[] des3hexbyte =hexString2Bytes("BCDDE8F8F0D0D18A3CCB9F889C4CE9C0");
jm3desres=cipher3des.doFinal(des3hexbyte);
System.out.println("3DES解密(Hex):"+new String(jm3desres));

二、分析源码,需hook的内容

3DES除了key和DES有区别外,其他的iv向量和dofinal都一样,所以只要hook类javax.crypto.spec.DESedeKeySpec就可以了

三、hook源码

XposedBridge.hookAllConstructors(XposedHelpers.findClass(
"javax.crypto.spec.DESedeKeySpec",
loadPackageParam.classLoader),
new XC_MethodHook() {
/* access modifiers changed from: protected */
public void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
byte[] keybyte = new byte[24];
int offset = 0;
if (param.args.length != 1) {
offset = ((Integer) param.args[1]).intValue();
}
System.arraycopy((byte[]) param.args[0], offset, keybyte, 0, 24);
String keyHex = b2s(keybyte);
String keyB64 = Base64.encodeToString(keybyte, 0);
Log.d("逆向有你", "3DESKey:" + new String(keybyte));
Log.d("逆向有你", "3DESKeyHex:" + keyHex);
Log.d("逆向有你", "3DESKeyB64:" + keyB64);
Log.d("逆向有你", "=====================3DESKey=========================");
}
});

四、AES算法源码

String bs= "逆向有你a";
SecretKeySpec aeskey = new SecretKeySpec("1234567812345678".getBytes(StandardCharsets.UTF_8),"AES");//获取密钥的实例
IvParameterSpec aesiv = new IvParameterSpec("1234567812345678".getBytes(StandardCharsets.UTF_8));//获取IV向量的实例
Cipher aescp = Cipher.getInstance("AES/CBC/PKCS5Padding");//告诉系统加密模式还有填充方式
aescp.init(1,aeskey,aesiv);//初始化加密方法
byte[] aesres = aescp.doFinal(bs.getBytes(StandardCharsets.UTF_8));//使用dofinal加密
System.out.println("aes加密(字节):"+Arrays.toString(aesres));
System.out.println("aes加密(Hex):"+bytes2HexString(aesres));
System.out.println("aes加密(Base64):"+Base64.getEncoder().encodeToString(aesres));
aescp.init(2,aeskey,aesiv);//初始化解密
byte[] jmaesres = aescp.doFinal(Base64.getDecoder().decode("MEpgbtD9muLvf6krtX86Og==".getBytes(StandardCharsets.UTF_8)));
System.out.println("aes解密(Base64):"+new String(jmaesres));
byte[] jmhexbyte =hexString2Bytes("304A606ED0FD9AE2EF7FA92BB57F3A3A");
jmhexbyte=aescp.doFinal(jmhexbyte);
System.out.println("aes解密(Hex):"+new String(jmhexbyte));
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 12天前 0

暂无评论

推荐阅读
  KRe60ogUm4le   2024年03月22日   35   0   0 linux算法
  KRe60ogUm4le   12天前   17   0   0 递归算法
  KRe60ogUm4le   5天前   15   0   0 javascala
KRe60ogUm4le