你在寻找这样的东西吗?
import java.util.Locale;
public class Obfuscate {
//adjust to suit:
final static int feistelRounds = 4;
final static int randRounds = 4;
final static int seed = 12345;
// modulus for half a string:
final static int mod = 60466176; //36^5
private static int f (int x) {
// http://en.wikipedia.org/wiki/Linear_congruential_generator
final int a = 12+1;
final int c = 1361423303;
x = (x + seed) % mod;
int r = randRounds;
while (r-- != 0) {
x = (a*x+c) % mod;
}
return x;
}
public static String obfuscate (int i) {
int a = i / mod;
int b = i % mod;
int r = feistelRounds;
while (r-- != 0) {
a = (a + f(b)) % mod;
b = (b + f(a)) % mod;
}
return pad5(Integer.toString(a, 36)) + pad5(Integer.toString(b, 36));
}
public static int illuminate (String s) {
int a = Integer.valueOf(s.substring(0,5),36);
int b = Integer.valueOf(s.substring(5,10),36);
int r = feistelRounds;
while (r-- != 0) {
b = (b - f(a)) % mod;
a = (a - f(b)) % mod;
}
// make the modulus positive:
a = (a + mod)%mod;
b = (b + mod)%mod;
return a*mod+b;
}
public static String pad5(String s) {
return String.format("%5s", s).replace(' ', '0').toUpperCase(Locale.ENGLISH);
}
public static String pad10(String s) {
return String.format("%10s", s).replace(' ', '0').toUpperCase(Locale.ENGLISH);
}
// demonstration
public static void main(String[] args) {
for (int i = 0; i<20; i++) {
System.out.printf("%08d -> %s -> %08d\n", i, obfuscate(i), illuminate(obfuscate(i)));
}
}
}
输出:
00000000 -> P2TH9ZW2VI -> 00000000
00000001 -> G47GI9ZR9S -> 00000001
00000002 -> 75LFRK3FO2 -> 00000002
00000003 -> Y6ZF0U742C -> 00000003
00000004 -> P8DE94ASGM -> 00000004
00000005 -> G9RDIEEGUW -> 00000005
00000006 -> 7B5CROI596 -> 00000006
00000007 -> YCJC0YLTNG -> 00000007
00000008 -> PDXB98PI1Q -> 00000008
00000009 -> GFBAIIT6G0 -> 00000009
00000010 -> 7GP9RSWUUA -> 00000010
00000011 -> YI39030J8K -> 00000011
00000012 -> PJH89D47MU -> 00000012
00000013 -> GKV7IN7W14 -> 00000013
00000014 -> 7M96RXBKFE -> 00000014
00000015 -> YNN607F8TO -> 00000015
00000016 -> PP159HIX7Y -> 00000016
00000017 -> GQF4IRMLM8 -> 00000017
00000018 -> 7RT3R1QA0I -> 00000018
00000019 -> YT730BTYES -> 00000019
基本上,这是一个玩具,完全不安全,虽然写起来很有趣,加密算法。(加密确实是您所要求的——其他人无法理解但您可以逆转的输出。)我使用简单的 prng作为f 函数。
不过,结果很漂亮,对吧?如上所述,DES 会更安全。但是,如果你宁愿重新发明轮子(我自己也有点抗拒这种冲动)并且真正的安全不是问题,那么这是一个合理的起点。顺便说一句,DES 也基于 Feistel 网络。
实际上,根据您的要求,可能存在基于非加密的解决方案。如果这是,比如说,一个需要检查但没有猜到的优惠券代码,我只需在我的数据库中创建一个表,将 id 与随机生成的 10 个字符代码相关联(或将代码列添加到现有表优惠券)并在它们进入时进行查找。这当然需要编码和恢复软件能够访问相同的数据库,或者能够进行通信。