# 数据加密隐藏算法之增强异或加密算法

1. 我们需要将一个数据从一个地方传递到另一个地方，这个数据时关于用户的敏感数据，不想被第三方截获发现使用；

2. 我们希望接收方能够根据接收的数据反向直接解析出原数据，而不需要调用第三方接口查询接收到数据的原始数据；

3. 我们希望加密后的长度能够一致；

0： key1   189076573222322987

N       1 :   key2    889237829273747382

2： key3    283847383829237483

<span style="font-size:18px;"><span style="font-size:18px;">public final class UidGenerator {

private static final Random RANDOM = new Random(System.currentTimeMillis());

public static final String generateUidFromCaller(String caller) {
StringBuilder sb = new StringBuilder();
int randomnumber = RANDOM.nextInt(3);
sb.append(generateRandStr(3, 10));
sb.append(caller);
sb.append(generateRandStr(3, 10));
String preTokenid = sb.substring(8, sb.length()) + sb.substring(0, 8);
BigInteger t1 = new BigInteger(preTokenid);
t1 = t1.xor(selectKeyByRandomNumer(randomnumber));
sb.setLength(0);
Long result = t1.longValue();
String temp = Long.toHexString(result);
sb.append(temp);
while (sb.length() < 15) {// 18位的数字转换成十六进制最多15位
sb.insert(0, '0');
}
sb.insert(0,generateRandStr(2, 10));
sb.insert(0,randomnumber);
return sb.toString();
}

public static final String getCallerFromUid(String tokenid) {
// 取出插入标识哪个加密密钥的随机数randomnumber
int randomnumber = TryParser.parseInt(tokenid.substring(2, 3), -1);
if (randomnumber == -1) {
return null;
}
StringBuilder sb = new StringBuilder(tokenid);
sb.delete(0, 3);
Long tokenidLong = Long.parseLong(sb.toString(), 16);
BigInteger t1 = new BigInteger(tokenidLong + "");
t1 = t1.xor(selectKeyByRandomNumer(randomnumber));
String result = t1.longValue() + "";
if (StringUtils.length(result) >= 8) {
sb.setLength(0);
sb.append(result.substring(result.length() - 8, result.length()));
sb.append(result.substring(0, result.length() - 8));
sb.delete(0, 3);
sb.delete(sb.length() - 3, sb.length());
String caller = sb.toString();
if (isValidCaller(caller)) {
return caller;
}
}
return null;
}

private static BigInteger selectKeyByRandomNumer(int n) {
return KEYS[n % 3];
}

public static String generateRandStr(int length, int max) {
StringBuilder result = new StringBuilder();
if (length > 0) {
while (length > 0) {
result.append(RANDOM.nextInt(max));
length--;
}
}
return result.toString();
}

}</span>
</span>

• 本文已收录于以下专栏：

## 文件加密（二） 异或加密

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)