面试题:以前的项目有没有用到:“网络传输加密” Base64
话不多说上代码:`package com.xxx.client;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
public class Ticket {
private static int random() {
return (int) (100 * Math.random() + 1);
}
/**
* 将字符串字节按位异或。
* @param str 字符串
* @param num 异或数
* @return
*/
private static String xor(String str, int num) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
int charVal = str.charAt(i);
charVal ^= num;
result.append((char) charVal);
}
return result.toString();
}
/**
* Base64加密
* @param ticket
* @return
*/
public static String encode(String ticket) {
ticket = StringUtils.reverse(Base64.encodeBase64String(ticket.getBytes()));
Integer rand = random();
// 按位异或
ticket = xor(ticket, rand % 32);
// rand encode
String encodeRand = Base64.encodeBase64String(String.valueOf(rand).getBytes());
// encode(encode(rand) + ';' + encode(ticket))
String encodeTicket = Base64.encodeBase64String(ticket.getBytes());
String encode = encodeRand + ";" + encodeTicket;
return Base64.encodeBase64String(encode.getBytes());
}
/**
* Base64解密
* @param userKey
* @return
*/
public static String decode(String userKey) {
userKey = new String(Base64.decodeBase64(userKey));
String[] strs = userKey.split(";");
// 获取 rand
int rand = Integer.parseInt(new String(Base64.decodeBase64(strs[0])));
// 获取 encode
String ticket = new String(Base64.decodeBase64(strs[1]));
// 按位异或
ticket = xor(ticket, rand % 32);
return new String(Base64.decodeBase64(StringUtils.reverse(ticket)));
}
public static void main(String[] args) {
String userKey = "admin-TEST";
String encode = encode(userKey);
System.out.println("E: " + encode);
System.out.println("D: " + decode(encode));
}
}`