我使用AES加密17位数字(例如,12345678901234567),然后我对byte[]
进行Base64编码。最终结果字符串的长度是24.我想条形码,24个字符太长。一个由15个字符组成的字符串会很好,大约15位数(例如123456789012345)会更好。
任何人都有办法实现我的目标 算法(AES,DES,3DES ..)?怎么样?
我的DES加密算法,
public static byte[] encrypt(byte[] datasource, String password) {
try{
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(password.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
return cipher.doFinal(datasource);
}catch(Throwable e){
e.printStackTrace();
}
return null;
}
private static void longToByteArray(long l, byte[] b) {
b[7] = (byte) (l);
l >>>= 8;
b[6] = (byte) (l);
l >>>= 8;
b[5] = (byte) (l);
l >>>= 8;
b[4] = (byte) (l);
l >>>= 8;
b[3] = (byte) (l);
l >>>= 8;
b[2] = (byte) (l);
l >>>= 8;
b[1] = (byte) (l);
l >>>= 8;
b[0] = (byte) (l);
}
long aliveTime = Long.parseLong("13664547854160806");
byte[] longAsBytes = new byte[8];
longToByteArray(aliveTime, longAsBytes);
byte[] result = DES.encrypt(longAsBytes, password);
String en = REncrypt.base64Encode(result);
答案 0 :(得分:1)
加密算法不会压缩数据。实际上,如果有的话,加密数据将比原始数据更难压缩。加密算法执行的“加扰”将使加密数据中的任何冗余更难(可能不可能)提取。
更好的方法是在加密之前压缩17位数字。在这种情况下,将十进制字符转换为二进制数可能会比文本压缩算法提供更好的压缩。一个17位数字将适合8个字节;即Java long
。
所以这就是我要做的事情:
long
;即使用Long.parseLong
或类似方法解析它。long
拆分为8个字节,并将它们放入byte[]
。byte[]
。结果应该是8个字节。如果这样做,加密的base64编码数字应少于15个字符。
注意:我假设你真的是指加密;即您需要能够解密并恢复原始号码。
<强>更新强>
这可能不适用于许多/最有代表性的加密算法,因为它们通常具有太小的最小块大小。见https://en.wikipedia.org/wiki/Block_size_(cryptography)。如果你阅读这篇文章,你将会了解为什么会这样。
你应该回顾一下你在这里想要实现的目标,并确定加密是否是实现它的最佳方式。