玩一玩

67 阅读3分钟

1. 自定义编码规则

  • 可以用于URL的编码
  • 解码规则可自行补充
  • 扩展 :可以每次生成不同的编解码字符映射
    • 找出大量的中文繁体形近字,作为‘编码字符池’
    • 每次使用随机抽取形式,找出的N个不重复字符作为当下编码字符
    • 将这N个字符组成的字符串保存下来,用于生成特定的编解码逻辑
      • 获取当下编码字符串
      //获取当下编解码字符串
      //将currEncodeStr保存下来,用于生成特定的编解码逻辑
      String currEncodeStr = gainCurrEncodeStr();
      
      • 编码
      //将获取的编码字符串传入,生成数组
      String[] encodeStrs = gainEncodeStrs(currEncodeStr);
      //编码逻辑中的字符,取数组中对应索引的值
      URL_COLON = encodeStrs[0];
      ***
      URL_HTTPS = encodeStr[X];
      
      //对特定字符串的加密/编码,逻辑不变
      
      • 解码使用编码逆逻辑
  • 如果APP被破解了怎么办
    • 房价开始
package com.example.myapplication.base64;

import java.util.HashMap;

public class Constants {
    // :
    private String URL_COLON = "乮";
    // /
    private String URL_BACKSLASH = "缬";
    // .
    private String URL_DOT = "驔";
    // ?
    private String URL_QUESTION_MARK = "璺";
    // =
    private String URL_EQUAL_SIGN = "戥";
    // &
    private String URL_AND = "肀";
    // _
    private String URL_UNDERLINE = "笚";
    // -
    private String URL_STRIKETHROUGH = "鼨";
    // %
    private String URL_PERCENTAGE_SIGN = "韛";
    // ~
    private String URL_TILDE = "癶";
    // !
    private String URL_EXCLAMATION_MARK = "罎";
    // *
    private String URL_ASTERISK = "餳";
    // '
    private String URL_ITS = "恴";
    // (
    private String URL_OPEN_PAREN = "糳";
    // )
    private String URL_CLOSE_PAREN = "邎";
    // [
    private String URL_OPEN_BRACKET = "丌";
    // ]
    private String URL_CLOSE_BRACKET = "乿";
    // ;
    private String URL_SEMICOLON = "瞓";
    // @
    private String URL_AT = "甼";
    // +
    private String URL_PLUS = "斝";
    // $
    private String URL_DOLLAR = "霉";
    // ,
    private String URL_COMMA = "鬭";
    // #
    private String URL_POUND = "秔";

    // 0 - 9
    private String URL_ZERO = "劔";
    private String URL_ONE = "灋";
    private String URL_TWO = "嵿";
    private String URL_THREE = "齩";
    private String URL_FOUR = "麃";
    private String URL_FIVE = "瀙";
    private String URL_SIX = "綖";
    private String URL_SEVEN = "轟";
    private String URL_EIGHT = "磿";
    private String URL_NINE = "焈";
    // a - z
    private String URL_LOWER_A = "嵷";
    private String URL_LOWER_B = "徝";
    private String URL_LOWER_C = "伋";
    private String URL_LOWER_D = "痏";
    private String URL_LOWER_E = "邜";
    private String URL_LOWER_F = "浫";
    private String URL_LOWER_G = "袊";
    private String URL_LOWER_H = "譃";
    private String URL_LOWER_I = "迴";
    private String URL_LOWER_J = "袣";
    private String URL_LOWER_K = "鼱";
    private String URL_LOWER_L = "雹";
    private String URL_LOWER_M = "怮";
    private String URL_LOWER_N = "悿";
    private String URL_LOWER_O = "錿";
    private String URL_LOWER_P = "攳";
    private String URL_LOWER_Q = "淎";
    private String URL_LOWER_R = "鸔";
    private String URL_LOWER_S = "蠯";
    private String URL_LOWER_T = "盞";
    private String URL_LOWER_U = "藄";
    private String URL_LOWER_V = "嫏";
    private String URL_LOWER_W = "崱";
    private String URL_LOWER_X = "雛";
    private String URL_LOWER_Y = "槬";
    private String URL_LOWER_Z = "湼";
    // A - Z
    private String URL_UPPER_A = "戙";
    private String URL_UPPER_B = "嘠";
    private String URL_UPPER_C = "鑵";
    private String URL_UPPER_D = "嚽";
    private String URL_UPPER_E = "頛";
    private String URL_UPPER_F = "轞";
    private String URL_UPPER_G = "錏";
    private String URL_UPPER_H = "飣";
    private String URL_UPPER_I = "摾";
    private String URL_UPPER_J = "捰";
    private String URL_UPPER_K = "龊";
    private String URL_UPPER_L = "懰";
    private String URL_UPPER_M = "淁";
    private String URL_UPPER_N = "矷";
    private String URL_UPPER_O = "嵨";
    private String URL_UPPER_P = "呻";
    private String URL_UPPER_Q = "欬";
    private String URL_UPPER_R = "椥";
    private String URL_UPPER_S = "埫";
    private String URL_UPPER_T = "鄬";
    private String URL_UPPER_U = "匽";
    private String URL_UPPER_V = "袸";
    private String URL_UPPER_W = "粑";
    private String URL_UPPER_X = "裾";
    private String URL_UPPER_Y = "鴏";
    private String URL_UPPER_Z = "昄";
    // https://
    private String URL_START_HTTPS = "https://";
    // http://
    private String URL_START_HTTP = "http://";
    // 传输明文
    private String URL_HTTP = "明";
    // 传输密文
    private String URL_HTTPS = "幂";
    // 填充字符
    private String URL_OCCUPY = "齉龘齾爩麤龗灪龖厵纞虋馫飝鱻灥靐飍朤譶嚻";

    public HashMap<String, String> gainUrlMapper() {
        HashMap<String, String> mapper = new HashMap<>();
        mapper.put(":", URL_COLON);
        mapper.put("/", URL_BACKSLASH);
        mapper.put(".", URL_DOT);
        mapper.put("?", URL_QUESTION_MARK);
        mapper.put("=", URL_EQUAL_SIGN);
        mapper.put("&", URL_AND);
        mapper.put("_", URL_UNDERLINE);
        mapper.put("-", URL_STRIKETHROUGH);
        mapper.put("%", URL_PERCENTAGE_SIGN);
        mapper.put("~", URL_TILDE);
        mapper.put("!", URL_EXCLAMATION_MARK);
        mapper.put("*", URL_ASTERISK);
        mapper.put("'", URL_ITS);
        mapper.put("(", URL_OPEN_PAREN);
        mapper.put(")", URL_CLOSE_PAREN);
        mapper.put("[", URL_OPEN_BRACKET);
        mapper.put("]", URL_CLOSE_BRACKET);
        mapper.put(";", URL_SEMICOLON);
        mapper.put("@", URL_AT);
        mapper.put("+", URL_PLUS);
        mapper.put("$", URL_DOLLAR);
        mapper.put(",", URL_COMMA);
        mapper.put("#", URL_POUND);
        mapper.put("0", URL_ZERO);
        mapper.put("1", URL_ONE);
        mapper.put("2", URL_TWO);
        mapper.put("3", URL_THREE);
        mapper.put("4", URL_FOUR);
        mapper.put("5", URL_FIVE);
        mapper.put("6", URL_SIX);
        mapper.put("7", URL_SEVEN);
        mapper.put("8", URL_EIGHT);
        mapper.put("9", URL_NINE);
        mapper.put("a", URL_LOWER_A);
        mapper.put("b", URL_LOWER_B);
        mapper.put("c", URL_LOWER_C);
        mapper.put("d", URL_LOWER_D);
        mapper.put("e", URL_LOWER_E);
        mapper.put("f", URL_LOWER_F);
        mapper.put("g", URL_LOWER_G);
        mapper.put("h", URL_LOWER_H);
        mapper.put("i", URL_LOWER_I);
        mapper.put("j", URL_LOWER_J);
        mapper.put("k", URL_LOWER_K);
        mapper.put("l", URL_LOWER_L);
        mapper.put("m", URL_LOWER_M);
        mapper.put("n", URL_LOWER_N);
        mapper.put("o", URL_LOWER_O);
        mapper.put("p", URL_LOWER_P);
        mapper.put("q", URL_LOWER_Q);
        mapper.put("r", URL_LOWER_R);
        mapper.put("s", URL_LOWER_S);
        mapper.put("t", URL_LOWER_T);
        mapper.put("u", URL_LOWER_U);
        mapper.put("v", URL_LOWER_V);
        mapper.put("w", URL_LOWER_W);
        mapper.put("x", URL_LOWER_X);
        mapper.put("y", URL_LOWER_Y);
        mapper.put("z", URL_LOWER_Z);
        mapper.put("A", URL_UPPER_A);
        mapper.put("B", URL_UPPER_B);
        mapper.put("C", URL_UPPER_C);
        mapper.put("D", URL_UPPER_D);
        mapper.put("E", URL_UPPER_E);
        mapper.put("F", URL_UPPER_F);
        mapper.put("G", URL_UPPER_G);
        mapper.put("H", URL_UPPER_H);
        mapper.put("I", URL_UPPER_I);
        mapper.put("J", URL_UPPER_J);
        mapper.put("K", URL_UPPER_K);
        mapper.put("L", URL_UPPER_L);
        mapper.put("M", URL_UPPER_M);
        mapper.put("N", URL_UPPER_N);
        mapper.put("O", URL_UPPER_O);
        mapper.put("P", URL_UPPER_P);
        mapper.put("Q", URL_UPPER_Q);
        mapper.put("R", URL_UPPER_R);
        mapper.put("S", URL_UPPER_S);
        mapper.put("T", URL_UPPER_T);
        mapper.put("U", URL_UPPER_U);
        mapper.put("V", URL_UPPER_V);
        mapper.put("W", URL_UPPER_W);
        mapper.put("X", URL_UPPER_X);
        mapper.put("Y", URL_UPPER_Y);
        mapper.put("Z", URL_UPPER_Z);
        return mapper;
    }

    public String gainEncodedUrl(String url) {
        //移除URL中的HTTP/HTTPS协议声明
        boolean http = url.startsWith(URL_START_HTTP);
        url = url.replace(URL_START_HTTPS, "");
        url = url.replace(URL_START_HTTP, "");
        boolean isLongUrl = url.length() >= 200;
        int occupyLength = isLongUrl ? URL_OCCUPY.length() / 2 : URL_OCCUPY.length() / 3;
        occupyLength = occupyLength > url.length() ? url.length() : occupyLength;
        HashMap<String, String> mapper = gainUrlMapper();
        StringBuilder builder = new StringBuilder();
        String currKey;
        //替换原始URL地址中的内容区域
        for (int i = 0; i < url.length(); i++) {
            currKey = url.substring(i, i + 1);
            if (mapper.containsKey(currKey)) {
                builder.append(mapper.get(currKey));
            } else {
                builder.append(currKey);
            }
        }
        //插入URL协议类型标记
        int index = (int) (Math.random() * builder.length());
        builder.insert(index, http ? URL_HTTP : URL_HTTPS);
        //插入填充字符
        int occupyIndex;
        String currOccupy;
        for (int i = 0; i < occupyLength; i++) {
            occupyIndex = (int) (Math.random() * URL_OCCUPY.length());
            currOccupy = URL_OCCUPY.substring(occupyIndex, occupyIndex + 1);
            index = (int) (Math.random() * builder.length());
            builder.insert(index, currOccupy);
        }
        url = builder.toString();
        return url;
    }
}
val oriStr = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91&fenlei=256&oq=android%2520%25E6%25B7%25B7%25E6%25B7%2586%2520%25E5%25BD%25A2%25E8%25BF%2591%25E5%25AD%2597&rsv_pq=dcde8f220004afcd&rsv_t=3845oqDCcnopQ4uqk4%2BfUwFQ5pHGOrjeN%2BAReiuuSH%2FfWArNhRdfPRQ6THA&rqlang=cn&rsv_dl=tb&rsv_enter=1&rsv_btype=t&inputT=7187&rsv_sug3=20&rsv_sug1=22&rsv_sug7=101&rsv_sug2=0&rsv_sug4=8791"
val newStr = Constants().gainEncodedUrl(oriStr)
tvNew.text = newStr
Log.i("TagCustomEncrypt","原始:"+oriStr+"\n编码后:"+newStr)
TagCustomEncrypt         I  原始:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91&fenlei=256&oq=android%2520%25E6%25B7%25B7%25E6%25B7%2586%2520%25E5%25BD%25A2%25E8%25BF%2591%25E5%25AD%2597&rsv_pq=dcde8f220004afcd&rsv_t=3845oqDCcnopQ4uqk4%2BfUwFQ5pHGOrjeN%2BAReiuuSH%2FfWArNhRdfPRQ6THA&rqlang=cn&rsv_dl=tb&rsv_enter=1&rsv_btype=t&inputT=7187&rsv_sug3=20&rsv_sug1=22&rsv_sug7=101&rsv_sug2=0&rsv_sug4=8791
                            编码后:崱崱崱驔徝嵷迴痏藄驔伋錿怮缬蠯璺迴邜戥藄盞浫鼨磿肀浫戥磿肀鸔蠯嫏笚徝攳戥灋肀鸔蠯嫏笚迴痏雛戥灋肀盞悿戥徝嵷迴痏藄肀崱痏戥韛頛轟韛焈焈韛嘠頛韛頛瀙韛嘠戙韛戙綖韛頛轟韛嘠轞韛嘠嘠韛頛磿韛戙轞龗韛焈灋肀浫邜悿雹邜迴戥嵿瀙綖肀錿淎戥嵷悿痏鸔錿迴痏韛嵿瀙嵿劔韛嵿瀙頛綖韛嵿瀙嘠轟韛嵿瀙嘠轟韛嵿瀙頛綖韛嵿瀙嘠轟韛嵿瀙磿綖韛嵿瀙嵿劔韛嵿瀙頛瀙韛嵿瀙嘠嚽韛嵿瀙戙嵿韛嵿瀙頛磿韛嵿瀙嘠轞韛嵿瀙幂焈灋韛嵿瀙頛瀙韛嵿瀙戙嚽韛嵿瀙焈轟肀鸔蠯嫏笚攳淎戥痏伋痏邜磿浫嵿嵿劔劔劔麃嵷浫伋痏肀鸔蠯嫏笚盞戥齩磿麃瀙錿淎嚽鑵伋悿錿攳欬麃藄淎鼱麃韛嵿嘠浫匽崱轞欬瀙攳飣錏嵨鸔袣邜矷韛嵿嘠戙椥邜迴藄譶藄埫飣韛嵿轞浫粑戙鸔矷譃椥痏浫呻椥欬綖灥鄬飣戙肀鸔淎雹嵷悿袊戥伋悿肀鸔蠯嫏笚龗痏雹戥盞徝肀鸔蠯馫嫏笚齉邜悿盞邜鸔戥灋肀鸔蠯纞嫏笚徝盞槬攳邜戥盞肀迴悿攳藄盞鄬戥轟灋磿轟肀灪鸔蠯嫏笚蠯藄袊齩戥嵿龖劔肀鸔蠯嫏笚蠯藄袊麤灋戥嵿嵿肀鸔蠯嫏笚蠯藄袊轟戥灋劔灋肀鸔蠯嫏笚蠯藄袊嵿戥劔肀鸔蠯嫏笚蠯藄袊麃戥磿轟焈灋