我们有1到999999之间的数字,我们需要使用简单的算法进行加密。加密输出应为人类可读字符(A-Z,0-9),且不得超过6位。
是否可以使用简单的算法将数字123456加密到例如GH6ZT3及以后将GH6ZT3解密为123456?
我只能找到Base32或Base64加密的示例,但加密输出远大于6位: - (
答案 0 :(得分:2)
如果您加密,则需要使用人类不可读的方式来表示数字。
要做你想做的事,你应该改变号码的基数。十六进制(基数为16)的东西应该给出一些好的结果。尝试另一个基础,如20。
看看:In Java how do you convert a decimal number to base 36?
或者,您可以选择Classical Criptography,例如Ancient Rome。但是你需要用将要读取的人来改变一个键。一把钥匙,意思是任何单词混合数字。
答案 1 :(得分:2)
如果您只是想混淆这些数字,那么可以通过模块化算术和基数36字符串的组合轻松完成。
以下是一些函数,可以使用从0到(36 6 - 1)的任何数字:
// Convert an integer (from 0 to 2176782335) into a 6-digit string in base 36.
// The result is obfuscated by using modular arithmetic, i.e. multiply by the
// (arbitrarily selected) prime number 1708159939 modulo 36^6 (2176782336)
public static String obfuscate(Long n) {
Long x;
x = (n * 1708159939L) % 2176782336L;
return String.format("%6s",Long.toString(x, 36).toUpperCase()).replace(' ','0');
}
// Inverse of the above function. Converts a 6-character base 36 string into
// an integer value. The number 1553655019 is the modular inverse of 1708159939
// (i.e., 1708159939 * 1553655019 = 1 (mod 36^6)
public static Long deobfuscate(String s) {
return (Long.valueOf(s, 36) * 1553655019L) % 2176782336L;
}
但请记住,混淆的字符串将包含6个字母或更少的每个字。这包括所有four-letter words。