我们来简单地对字符串加个密
作者:互联网
首先,我这的所谓加密,指的是后端给前端的值和后端接收前端传入的值不相同
我先贴上代码
/**
* 镜像加密,只针对数字和大小写字母进行简单的镜像加密
* 数字0对应数字9,小写字母a对应小写字母z,大写字母B对应大写字母Y
*/
public class ImageEncryptionUtil {
/**
* 数字0在ASCII表中对应的值
*/
private static final int MIN_NUMBER_ASCII = 48;
/**
* 数字9在ascii表中对应的值
*/
private static final int MAX_NUMBER_ASCII = 57;
/**
* 大写字母A在ASCII表中对应的值
*/
private static final int MIN_POWER_CASE_ASCII = 65;
/**
* 大写字母Z在ASCII表中对应的值
*/
private static final int MAX_POWER_CASE_ASCII = 90;
/**
* 小写字母a在ASCII表中对应的值
*/
private static final int MIN_LOWER_CASE_ASCII = 97;
/**
* 小写字母z在ASCII表中对应的值
*/
private static final int MAX_LOWER_CASE_ASCII = 122;
/**
* 加密
*
* @param str 需要加密的字符串
* @param overturn 是否翻转字符串
* @return 返回加密后的字符串
*/
public static String encrypt(String str, boolean overturn) {
return disorganize(init(str, overturn));
}
/**
* 加密
* 默认不翻转字符串
*
* @param str 需要加密的字符串
* @return 返回加密后的字符串
*/
public static String encrypt(String str) {
return disorganize(init(str, false));
}
/**
* 解密
*
* @param str 需要解密的字符串
* @return 返回解密后的字符串
*/
public static String decrypt(String str) {
return init(restore(str), false);
}
/**
* 解密
*
* @param str 需要解密的字符串
* @param overturn 是否翻转字符串
* @return 返回解密后的字符串
*/
public static String decrypt(String str, boolean overturn) {
return init(restore(str), overturn);
}
/**
* 加密主方法
*
* @param str 需要加密的字符串
* @param overturn 是否翻转字符串
* @return 返回加密后的字符串
*/
private static String init(String str, boolean overturn) {
StringBuilder builder = new StringBuilder();
if (overturn) {
for (int i = 0; i < str.length(); i++) {
builder.append(transform(str.charAt(str.length() - i - 1)));
}
} else {
for (int i = 0; i < str.length(); i++) {
builder.append(transform(str.charAt(i)));
}
}
return builder.toString();
}
/**
* 将字符进行转换
*
* @param current 需要转换的字符ASCII码
* @return 返回转换后的字符
*/
private static char transform(int current) {
if (isInRange(MIN_NUMBER_ASCII, MAX_NUMBER_ASCII, current)) {
return (char) (MIN_NUMBER_ASCII + MAX_NUMBER_ASCII - current);
} else if (isInRange(MIN_POWER_CASE_ASCII, MAX_POWER_CASE_ASCII, current)) {
return (char) (MIN_POWER_CASE_ASCII + MAX_POWER_CASE_ASCII - current);
} else if (isInRange(MIN_LOWER_CASE_ASCII, MAX_LOWER_CASE_ASCII, current)) {
return (char) (MIN_LOWER_CASE_ASCII + MAX_LOWER_CASE_ASCII - current);
}
return (char) current;
}
/**
* 判断数值是否在指定范围内
*
* @param min 范围最小值
* @param max 范围最大值
* @param current 需要判断的数值
* @return 返回结果
*/
private static boolean isInRange(int min, int max, int current) {
return Math.max(min, current) == Math.min(max, current);
}
/**
* 打乱字符串
*
* @param str 需要打乱的字符串
* @return 返回打乱后的字符串
*/
private static String disorganize(String str) {
StringBuilder builder = new StringBuilder();
// 将循环长度设为字符串长度的一半并向上取整
int max = (int) Math.ceil(str.length() / 2.0);
// 判断长度是否为奇数
boolean isOdd = (str.length() % 2 == 1);
for (int i = 0; i < max; i++) {
// 从头开始截取并添加字符
builder.append(str.charAt(i));
// 当是最后一次循环并且是奇数时直接结束
if (i == max - 1 && isOdd) {
break;
}
// 从末尾开始截取并添加字符
builder.append(str.charAt(str.length() - i - 1));
}
return builder.toString();
}
/**
* 还原字符串
*
* @param str 需要还原的字符串
* @return 返回还原后的字符串
*/
private static String restore(String str) {
StringBuilder builder = new StringBuilder();
// 字符串的长度作为循环长度
int max = str.length();
// 判断字符串长度是否为奇数
boolean isOdd = (max % 2 == 1);
// 设置i的跨度为2
int duration = 2;
// 先从头开始取偶数位的值并添加
for (int i = 0; i < max; i += duration) {
builder.append(str.charAt(i));
}
// 再从末尾开始取奇数位的值并添加
for (int i = 0; i < max - 1; i += duration) {
builder.append(str.charAt(str.length() - i - (isOdd ? 2 : 1)));
}
return builder.toString();
}
}
这个加密,我给他取名叫镜像加密,过程是这样的:
首先,所有的加密算法都是在ASCII码的基础上进行的,因为ASCII码是我们学习计算机技术最开始接触到的编码(准确来讲应该是二进制才对),所以这次加密我将这个作为标准;
假设我需要加密字符串"123abc",首先对字符'1'进行加密,我将字符'1'看作为数字,数字的范围为0-9,数字1为从头开始的第二位数字,所以我取从尾开始的第二位数字8作为数字的加密字符;
同理,我将字符'a'看作为小写字母,小写字母的范围为a-z,字母a为从头开始的第一位字母,所以我取从尾开始的第一位字母z作为字母a的加密字符。
结束之后,字符串"123abc"经过加密后应该为"876zyx",但这个字符串从结构上和加密前的字符串基本一致,所以我对其进行的打乱操作(其实打的并不是很乱...):
首先从加密后的字符串取从头开始的第一位字符,接着取从尾开始的第一位字符,然后取从头开始的第二位字符,接着取从尾开始的第二位字符...
这样一来,字符串"123abc"经过一系列操作后就变成了"8x7y6z",这样虽然看上去依旧很简单,但当需要加密的字符串为随机产生的字符串时,就不那么明显了(产生随机字符串的代码我之前也有发过,直达连接:根据不同的需求(数字、小写字母、大写字母组合,新增汉字,特殊字符、数字、大小写字母组合)产生指定位数的随机数_hjh70983704的博客-CSDN博客https://blog.csdn.net/hjh70983704/article/details/120623863?spm=1001.2014.3001.5501),譬如字符串"Vnyi0QE4B61a"经过加密后为”Ezm8b3rY95JV“
ps:从实用和可读性角度出发,这个加密只涉及了数字0-9、小写字母a-z及大写字母A-Z的加密
方法调用:
int strLength = 12;
int strType = RandomStringUtil.FIGURE_LOWER_CASE_POWER_CASE;
// 原字符串
String str = RandomStringUtil.createRandomString(strLength, strType);
System.out.println(str);
// 加密后的字符串
str = ImageEncryptionUtil.encrypt(str);
System.out.println(str);
// 解密后的字符串
str = ImageEncryptionUtil.decrypt(str);
System.out.println(str);
本方法里还包含了加密后是否将字符串反转,譬如字符串"123abc"若设置了反转,则返回"cba321",若在加密中设置了反转,则在解密中也必须设置反转:
int strLength = 12;
int strType = RandomStringUtil.FIGURE_LOWER_CASE_POWER_CASE;
// 原字符串
String str = RandomStringUtil.createRandomString(strLength, strType);
System.out.println(str);
// 加密后的字符串
str = ImageEncryptionUtil.encrypt(str, true);
System.out.println(str);
// 解密后的字符串
str = ImageEncryptionUtil.decrypt(str, true);
System.out.println(str);
标签:加密,加个,int,str,简单,字符串,return,ASCII 来源: https://blog.csdn.net/hjh70983704/article/details/121431075