wystudio 发表于 2023-7-14 13:50

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

本帖最后由 wystudio 于 2023-7-16 15:11 编辑


# 本文只是提供一种思路,中途的代码可以再加修改
# 前言
本加密算法是在作者逛论坛时由坛友一篇文章引发的灵感[【前端逆向】社会主义核心价值观加密方法解析+python版复现](https://www.52pojie.cn//thread-1690132-1-1.html)
这篇文章介绍了一种名为 `社会主义核心价值观加密方法` 旨在通过编程学习党的十八大提出的社会主义核心价值观。

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

# 算法介绍
之所以取这个名字,那是因为加密后的密文以***中文汉字***输出,且内容***积极,阳光,向上***。
>例如:
原文为 "06"
则密文为 "中国"

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

# 算法原理
### 1.将原文进行URL编码
目的:将中文汉字转为使用字母+数字替代

### 2.转为十六进制
将上一步得到的字符串转为16进制文本(小写)
目的:将整个字符串变为只由6个字母``和9个数字``组成

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

### 4.遍历char[]数组
遍历上一步得到的char[]数组,将有以下两种情况:
#### ①遍历得到的元素为的数字
将此数字作为索引,从 `常量文本数组一` 中获取元素
> 常量文本数组一 = {"中","华","人","民","共","和","国","万","岁","政"}

假如数字为1,则得到"华"
#### ②遍历得到的元素为的字母
先获取这个字母在26个英文字母表中的位置
如a为1,b为2
将获取到的***数字减1***作为索引。从 `常量文本数组二` 中获取元素
> 常量文本数组二 = {"富","强","文","明","平","等"}

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

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

***解密过程相反即可***

# 算法代码
```java
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) != -1) {
                  sb.append(findInNum(chars));
                } else {
                  if (findInEn(chars) != -1) {
                        sb.append(LIST_HEX)]);
                  }
                }
            }
            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);
            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 + "" + charArray;
            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)) {
                sb.append(LIST_CODE_NUM + "")]);
            } else {
                sb.append(LIST_CODE_EN) - 1]);
            }
      }
      return sb.toString();
    }

    private static boolean isNum(char str) {
      Pattern pattern = Pattern.compile("*");
      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.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.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/) (无联系方式)

本文已同步发至作者博客[立即查看](https://blog.wystudio.xyz/index.php/2023/07/14/java%e5%8e%9f%e5%88%9b%e4%b8%ad%e5%9b%bd%e7%ba%a2%e8%89%b2%e5%8a%a0%e5%af%86%f0%9f%87%a8%f0%9f%87%b3-%e5%8a%a0%e5%af%86%e7%ae%97%e6%b3%95/) (无联系方式)

wystudio 发表于 2023-7-14 14:26

本帖最后由 wystudio 于 2023-7-16 11:52 编辑

人和共和民和人和民红民中人和共人共和人和共和民万人和民岁民岁人和共人民华人和共和民万人和共华民中人和共人民共人和共和民岁人和共华民万人和共华民民人和共和民岁人和共华共和人和共人共华人和共和民和人和民红共共人和民红共人民国民国民国


大家把这上面这段文本解密看看是什么{:301_997:}

wystudio 发表于 2023-7-14 18:43

pojie6033 发表于 2023-7-14 18:23
本质上就是替换。
加密是有乘法,异或,密钥扩散之类的操作

只是提供一种思路,中途索引的获取可以再进行其他更复杂的操作

XYZ1234567890 发表于 2023-7-16 15:59

解密——吾爱破解论坛666

colaya 发表于 2023-7-14 14:22

学习了 谢谢

Bszk 发表于 2023-7-14 14:51

改了码表,看不出来新在何处。

wystudio 发表于 2023-7-14 15:07

Bszk 发表于 2023-7-14 14:51
改了码表,看不出来新在何处。

只是提供一个思路罢了

pojie6033 发表于 2023-7-14 18:23

本质上就是替换。
加密是有乘法,异或,密钥扩散之类的操作

wystudio 发表于 2023-7-16 09:55

手动顶贴

不知道改成啥 发表于 2023-7-16 14:53

红色加密感觉很吊的样子

ltylsy 发表于 2023-7-16 14:55

这个只能看看!
页: [1] 2 3 4 5 6 7
查看完整版本: [Java原创] 专属于中国人的加密方法--红色加密(内附在线演示网站)