(1)使用Based64编码时出现的问题。
java.lang.IllegalArgumentException
这中情况出现在解密时,主要原因是based64加密时用了sun的内部包sun.misc,这是sun公司专门提供给内部使用的API,所以应该换其他的包试试,如下:
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.apache.commons.codec.binary.Based64;
但是第一个类,该类不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用。但是在eclipse中直接使用却找不到该类。可以在eclipse
上用如下方法解决
Properties-->Bulid Path-> Libraries -->JRESystem Library-->Access rules -->双击-->Type Access Rules,在Accessible中添加accessible,下面填上**点击确定
具体请看:
(2)解决问题(1)之后,发现出现如下问题:
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
这是因为DES的填充模式不同,建议使用ECB模式,同时如果使用的是NoPadding填充方式也会出现上述问题,建议使用PKCS5Padding填充方式,这个就不需要输入的源数据为8的倍数了。
(3)可是使用了"DES/ECB/PKCS5Padding",还是出现了上述问题,最后绞尽脑汁,才发现自己加密时是先加密,然后用的BASED64编码了,解密的时候先解密,然后再解码,这种方式错误了,解密时应该先解码再解密,可以防止未解码而导致源数据出现的问题,
(4)最后检查代码时,发现中文加密后,进行解密时,解出的明文是乱码,原来我加密时用了data.getBytes("utf-8"),而解密时,我用了return new String(Base64.encode(cipher.doFinal(data))),无法以相同的方式将字节数组转化为字符串,因此我将加密解密字符串与字节数组的转化方式设为默认,也就是不写,然后就成功了。