抓包过程中的加密解密操作

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

通过charles抓包如下:

抓包过程中的加密解密操作_第1张图片
数据加密.png

抓包发现请求的参数被加密了,具体像base64的编码,但是不知道中间怎么处理过了。只能通过 jd-gui,通过 apktooldex2jar把apk反编译成jar。具体怎么使用 apktooldex2jar参考: https://www.jianshu.com/p/59802828355b。
抓包过程中的加密解密操作_第2张图片
生成的jar.png

请求中的密码进行了加密处理,在反编译的代码中找到加密的逻辑:
抓包过程中的加密解密操作_第3张图片
加密逻辑1.png

抓包过程中的加密解密操作_第4张图片
加密逻辑2.png

编写代码加密逻辑:

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();

调试遇到的问题:


抓包过程中的加密解密操作_第5张图片
padd填充字符串错误.png

抓包过程中的加密解密操作_第6张图片
密钥长度错误.png

不支持PKCS7Padding.png

解决办法:

Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
Security.addProvider(provider);

常见的加密解密算法:
https://blog.csdn.net/huangxiaoguo1/article/details/78043098

总结:反编译的代码还是有时要调整才可以用的

你可能感兴趣的:(抓包过程中的加密解密操作)