ps:在这里记录我的一次抓包经历,涉及到的加密解密流程。
上一章:https://www.jianshu.com/p/d9b1cee69552 解决了这个问题后的后续问题。
通过charles抓包如下:

抓包发现请求的参数被加密了,具体像base64的编码,但是不知道中间怎么处理过了。只能通过jd-gui,通过apktool和dex2jar把apk反编译成jar。具体怎么使用apktool和dex2jar参考:https://www.jianshu.com/p/59802828355b。

请求中的密码进行了加密处理,在反编译的代码中找到加密的逻辑:


编写代码加密逻辑:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
/**
* @author: jack
* @Date: 2019/7/15 20:39
* @Description:
*/
public class DesEncrypt {
private static final String PADD0 = "NOPadding";
private static final String PADD1 = "PKCS1Padding";
private static final String PADD5 = "PKCS5Padding";
private static final String PADD7 = "PKCS7Padding";
/**
* 加密
* @param paramString
* @param secretKey
* @return
*/
public static byte[] encryptByECB(String paramString,String secretKey,String padd) {
try {
padd = getPadd(padd);
paramString = new StringBuffer(paramString).append("|").toString();
SecretKeySpec aesKey = new SecretKeySpec(secretKey.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/"+padd);
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
return cipher.doFinal(paramString.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解密
* @param paramString
* @param secretKey
* @param padd
* @return
*/
public static String decryptByECB(byte[] paramString, String secretKey,String padd){
try {
padd = getPadd(padd);
SecretKeySpec aesKey = new SecretKeySpec(secretKey.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/"+padd);
cipher.init(Cipher.DECRYPT_MODE, aesKey);
return new String(cipher.doFinal(paramString));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String getPadd(String padd) {
switch (padd) {
case "1":
padd = PADD1;
break;
case "5":
padd = PADD5;
break;
case "7":
padd = PADD7;
break;
default:
padd = PADD0;
}
return padd;
}
}
最后发现反编译的代码运行的结果还是有出入的,去掉这行代码,加密解密运行正确:
paramString = new StringBuffer(paramString).append("|").toString();
调试遇到的问题:



解决办法:
Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
Security.addProvider(provider);
常见的加密解密算法:
https://blog.csdn.net/huangxiaoguo1/article/details/78043098
总结:反编译的代码还是有时要调整才可以用的
网友评论