java可以通过AES或其他算法将17位加密为15位
我使用AES加密一个17位数字(例如,12345678901234567),然后使用Base64对byte[]
进行编码。最终结果字符串的长度为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);
# 1 楼答案
加密算法不会压缩数据。事实上,如果有什么区别的话,加密数据将比原始数据更难压缩。加密算法执行的“置乱”将使加密数据中的任何冗余更难提取(可能不可能)
更好的方法是在加密前压缩17位数字。在这种情况下,将十进制字符转换为二进制数可能会比文本压缩算法提供更好的压缩。一个17位的数字可以容纳8个字节;i、 e.一个Java{}
下面是我要做的:
long
;i、 e.使用Long.parseLong
或类似方法解析它李>long
拆分为8个字节,并将它们放入byte[]
中李>byte[]
。结果应该是8字节李>如果你这样做,你的加密,base64编码的数字应该少于15个字符
注意:我假设你的意思是加密;i、 e.你需要能够解密并恢复原始数字
更新
这可能不适用于许多/最合适的加密算法,因为它们通常具有过大的最小块大小。见https://en.wikipedia.org/wiki/Block_size_(cryptography)。如果你读了这篇文章,你就会了解为什么会这样
您可能应该回顾一下您真正想要实现的目标,并决定加密是否是实现它的最佳方式