本文只是提供一种思路,中途的代码可以再加修改
前言
本加密算法是在作者逛论坛时由坛友一篇文章引发的灵感【前端逆向】社会主义核心价值观加密方法解析+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()
函数,并传入密文
写在最后
本加密算法仅供学习交流,禁止用于非法用途
本文已同步发至作者博客立即查看 (无联系方式)