原理
使用一个分隔符将两个字符串连接在一起,并对连接后的字符串进行加密。加密过程中,首先生成一个随机下标列表,然后根据随机下标打乱字符串的顺序,并使用Base64进行编码。解密过程中,根据之前生成的随机下标列表将字符串还原,并使用Base64进行解码,最后根据分隔符将字符串拆分为原始的两个字符串。
工具类
public class TwoStringMergeEncodeDecodeUtil {
/**
* 分隔符
/
private static String delimiter = “#”;
/*
* 存放生成的随机下标
*/
private static List randIndex = new ArrayList<>();
/**
* 加密
* @param str1
* @param str2
* @return
*/
public static String encode(String str1, String str2) {
final String str = str1 + delimiter + str2;
final int length = str.length();
//生成随机下标
randIndex = genRangedDigit(0, length - 1);
String res = "";
for (int i = 0; i < length; i++) {
res += str.charAt(randIndex.get(i));
}
return Base64Util.encode(res);
}
/**
* 解密
* @param str
* @return
*/
public static String[] decode(String str) {
//解密
str = Base64Util.decode(str);
int length = str.length();
//存放随机下标列表的顺序
List<Integer> index = new ArrayList<>(length);
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++) {
if (i == randIndex.get(j)) {
index.add(j);
}
}
}
String str0 = "";
for (int i = 0; i < length; i++) {
str0 += str.charAt(index.get(i));
}
return str0.split(delimiter);
}
/**
* 产生[m,n]之间的n-m+1个随机数
* @param m
* @param n
* @return
*/
private static List<Integer> genRangedDigit(Integer m, Integer n) {
List<Integer> res = new ArrayList<>(n - m + 1);
final Random random = new Random();
int count = 0;
while (count < n - m + 1) {
int digit = random.nextInt(n - m + 1) + m;
if (!res.contains(digit)) {
res.add(digit);
count++;
}
}
return res;
}
}
测试代码
public static void main(String[] args) {
String str1 = "wq83PPtsQ0TZfy4qGF4mTZfy4qGF4m";
String str2 = "97803cc06467f95e4748ca52d7fd74e4934904e697c3889d";
final String encode = encode(str1, str2);
System.out.println(encode);
final String[] decode = decode(encode);
System.out.println(decode[0]);
System.out.println(decode[1]);
System.out.println(decode[0].equalsIgnoreCase(str1));
System.out.println(decode[1].equalsIgnoreCase(str2));
}
结果: