1.前景:工做中须要实现一个功能,导出的数据须要加密,不能被明文看到,使用DES加密,对byte数组加密解密操做代码以下java
public class DESTool { static String transformation = "DESede/ECB/PKCS5Padding"; static String algorithm = "DESede"; public byte[] decode(byte[] srcByte, byte[] keyByte, int offset, int length) throws Exception, NoSuchAlgorithmException { // DESKeySpec spec = new DESKeySpec(keyByte); // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm); // SecretKey secretKey = keyFactory.generateSecret(spec); SecretKey secretKey = new SecretKeySpec(keyByte, algorithm); // KeySpec spec = new SecretKeySpec(keyByte, algorithm); // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm); // SecretKey secretKey = keyFactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(transformation); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] b = cipher.doFinal(srcByte, offset, length); return b; } public byte[] encode(byte[] srcByte, byte[] keyByte, int offset, int length) throws Exception, NoSuchAlgorithmException { // DESKeySpec spec = new DESKeySpec(keyByte); // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm); // SecretKey secretKey = keyFactory.generateSecret(spec); SecretKey secretKey = new SecretKeySpec(keyByte, algorithm); // KeySpec spec = new SecretKeySpec(keyByte, algorithm); // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm); // SecretKey secretKey = keyFactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(transformation); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] b = cipher.doFinal(srcByte, offset, length); return b; } }
2.在使用如上方法进行加解密时,因为文件大小是不肯定的,因此使用分批次加解密,一次加解密50*1024个bytelinux
3.自主测试没有问题,可是测试环境上出现问题,堆栈信息以下数据库
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DashoA13*..) at javax.crypto.Cipher.doFinal(DashoA13*..)
4.网上搜索答案都是说一些linux上SecretKey获取的问题,可是和本人工做中的情况不符,本人工做中windows开发环境上加密导出的文件去测试环境导入是能够正常导入的,而且本人写了测试类,编译成class文件后去测试环境执行class文件,加解密没有问题,因此这个可能性排除windows
5.因而我要来了测试环境的数据库链接信息,本地链接测试数据库,同时导出未加密的明文文件和加密的密文文件,以后对明文文件加密以后和密文文件逐字节进行对比,对比结果彻底同样数组
6.最后想到加密解密是按本身进行的,会不会是加解密的字节长度致使的,因而我把测试类中加密明文文件时使用的字节数组长度设置为5*1024,而不是50*1024,以后加密,再和密文文件逐字节对比,果真出现了不一样,ide
7.最后经测试,需加密的字节长度和加密结果的字节长度存在如下关系:加密结果字节长度 = (需加密字节长度/8)* 8 + 8;因而我把解密时字节长度改成了50*1024+8,问题解决测试
8.结论:加密过程当中字节长度可能会变化,所以解密时字节长度应该和加密时字节长度存在必定的相关关系,不能随便设置。加密