美文网首页
抓包过程中的加密解密操作

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

作者: 风一样的存在 | 来源:发表于2019-07-16 10:37 被阅读0次

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

通过charles抓包如下:

数据加密.png
抓包发现请求的参数被加密了,具体像base64的编码,但是不知道中间怎么处理过了。只能通过jd-gui,通过apktooldex2jar把apk反编译成jar。具体怎么使用apktooldex2jar参考:https://www.jianshu.com/p/59802828355b
生成的jar.png
请求中的密码进行了加密处理,在反编译的代码中找到加密的逻辑:
加密逻辑1.png
加密逻辑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();

调试遇到的问题:


padd填充字符串错误.png
密钥长度错误.png
不支持PKCS7Padding.png

解决办法:

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

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

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

相关文章

网友评论

      本文标题:抓包过程中的加密解密操作

      本文链接:https://www.haomeiwen.com/subject/shwokctx.html