WYstudio博客
记录一些学习过程中的经验,笔记
WYstudio博客

[Java原创] 专属于中国人的加密方法--红色加密(内附在线演示网站)

前言

本加密方法是在作者逛 吾爱破解论坛 时由一篇文章引发的灵感【前端逆向】社会主义核心价值观加密方法解析+python版复现
这篇文章介绍了一种名为 社会主义核心价值观加密方法 旨在通过编程学习党的十八大提出的社会主义核心价值观。

而本文提到的加密算法灵感来自于此,但加密原理与此加密方法完全不同

算法介绍

中国红色加密是一个新型加密算法,之所以取这个名字,那是因为加密后的密文以中文汉字输出,且内容积极,阳光,向上

例如:
原文为 "06"
则密文为 "中国"

注:支持中文汉字,英文,数字,以及特殊符号加密

算法原理

1.将原文进行URL编码

目的:将中文汉字转为使用字母+数字替代

2.转为十六进制

将上一步得到的字符串转为16进制文本(小写)
目的:将整个字符串变为只由6个字母[a-f]和9个数字[0-9]组成

3.转为char[]数组

将上一步得到的字符串转为由一个一个字符组成的char[]数组
例如:"123" 变成 {"1","2","3"}
目的:为下一步的索引提供准备

4.遍历char[]数组

遍历上一步得到的char[]数组,将有以下两种情况:

①遍历得到的元素为[0-9]的数字

将此数字作为索引,从 常量文本数组一 中获取元素

常量文本数组一 = {"中","华","人","民","共","和","国","万","岁","政"}

假如数字为1,则得到"华"

②遍历得到的元素为[a-f]的字母

先获取这个字母在26个英文字母表中的位置
如a为1,b为2
将获取到的数字减1作为索引。从 常量文本数组二 中获取元素

常量文本数组二 = {"富","强","文","明","平","等"}

假如字母为b,则获取到"强"

5.拼接即可

将上一步遍历char[]数组从常量文本数组中获取的元素拼接起来,最后输出即为密文

解密过程相反即可

算法代码

package xyz.wystudio.tool;

import java.util.regex.Matcher;
import java.net.URLEncoder;
import java.net.URLDecoder;
import java.io.UnsupportedEncodingException;
import java.util.regex.Pattern;

public class EncryptUtil {

    private static final String[] LIST_CODE_EN = { "富", "强", "文", "明", "平", "等" };
    private static final String[] LIST_CODE_NUM = { "中", "华", "人", "民", "共", "和", "国", "万", "岁", "红" };
    private static final String[] LIST_HEX = { "a", "b", "c", "d", "e", "f" };

    public static String encode(String str) {
        str = URLencode(str);
        String hexString = StringtoHex(str);
        return doInString(hexString);
    }

    public static String decode(String str) {
        try {
            StringBuffer sb = new StringBuffer();
            char[] chars = str.toCharArray();
            for (int i = 0; i < chars.length; i++) {
                if (findInNum(chars[i]) != -1) {
                    sb.append(findInNum(chars[i]));
                } else {
                    if (findInEn(chars[i]) != -1) {
                        sb.append(LIST_HEX[findInEn(chars[i])]);
                    }
                }
            }
            if(sb.toString().equals("") || sb.toString() == null){
                return "解密失败非密文";
            }
            return URLdecode(HextoString(sb.toString()));
        } catch (Exception e) {
            return "解密失败非密文";
        }
    }

    private static String StringtoHex(String str) {
        StringBuffer sb = new StringBuffer();
        //将字符串转换为字符数组
        char ch[] = str.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            String hexString = Integer.toHexString(ch[i]);
            sb.append(hexString);
        }
        String result = sb.toString();
        return result;
    }

    private static String HextoString(String str) {
        String result = new String();
        char[] charArray = str.toCharArray();
        for (int i = 0; i < charArray.length; i = i + 2) {
            String st = "" + charArray[i] + "" + charArray[i + 1];
            char ch = (char) Integer.parseInt(st, 16);
            result = result + ch;
        }
        return result;
    }

    private static String doInString(String str) {
        StringBuffer sb = new StringBuffer();
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (isNum(chars[i])) {
                sb.append(LIST_CODE_NUM[Integer.parseInt(chars[i] + "")]);
            } else {
                sb.append(LIST_CODE_EN[EntoInt(chars[i]) - 1]);
            }
        }
        return sb.toString();
    }

    private static boolean isNum(char str) {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str + "");
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

    private static int EntoInt(char ch1) {
        String str = ch1 + "";
        char ch = str.charAt(0);
        int num = 0;
        if (ch >= 'a' && ch <= 'z')
            num = (int) ch - 96;
        if (ch >= 'A' && ch <= 'Z')
            num = (int) ch - 64;
        return num;
    }

    private static int findInEn(char ch) {
        String str = ch + "";
        int a = -1;
        for (int i = 0; i < LIST_CODE_EN.length; i++) {
            if (LIST_CODE_EN[i].equals(str)) {
                a = i;
                break;
            }
        }
        return a;
    }

    private static int findInNum(char ch) {
        String str = ch + "";
        int a = -1;
        for (int i = 0; i < LIST_CODE_NUM.length; i++) {
            if (LIST_CODE_NUM[i].equals(str)) {
                a = i;
                break;
            }
        }
        return a;
    }

    private static String URLencode(String str) {
        try {
            return URLEncoder.encode(str, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return str;
        }
    }

    private static String URLdecode(String str) {
        try {
            return URLDecoder.decode(str, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return str;
        }
    }
}

加密方法调用EncryptUtil.encode()函数,并传入原文
解密方法调用EncryptUtil.decode()函数,并传入密文

在线尝试网站https://api.wystudio.xyz/wy/ZGHSEncrypt

写在最后

本加密算法仅供学习交流,禁止用于非法用途

本文已同步发至吾爱破解论坛立即查看

# #
首页      Java      [Java原创] 专属于中国人的加密方法--红色加密(内附在线演示网站)

发表回复

textsms
account_circle
email

WYstudio博客

[Java原创] 专属于中国人的加密方法--红色加密(内附在线演示网站)
前言 本加密方法是在作者逛 吾爱破解论坛 时由一篇文章引发的灵感【前端逆向】社会主义核心价值观加密方法解析+python版复现 这篇文章介绍了一种名为 社会主义核心价值观加密方法 旨在通…
扫描二维码继续阅读
2023-07-14