3DES 解密时,出现部分乱码,byte数组里有负值,不知道如何解决 ,求大神指导,代码如下:
import java.io.UnsupportedEncodingException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
/*字符串 DESede(3DES) 加密
* ECB模式/使用PKCS7方式填充不足位,目前给的密钥是192位
* 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的
* 加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加
* 密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的
* 密钥,P代表明文,C代表密表,这样,
* 3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
* 3DES解密过程为:P=Dk1((EK2(Dk3(C)))
* */
public class url {
private static final String Algorithm = "DESede/CBC/NoPadding"; //定义加密算法,可用 DES,DESede,Blowfish
private static final String key="CCBJF2014cowell20151118Y";
private static final String vi = "KW2015rj";
//keybyte为加密密钥,长度为24字节
//src为加密后的缓冲区
public static String decryptMode(String strMi){
try {
//szSrc.getBytes("UTF-8");
byte[] src = com.sun.org.apache.xml.internal.security.utils.Base64.decode(strMi);
//src = it.sauronsoftware.base64.Base64.encode(src);
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
IvParameterSpec iv = new IvParameterSpec(vi.getBytes());
Cipher cipher = Cipher.getInstance(Algorithm);
cipher.init(Cipher.DECRYPT_MODE, securekey,iv );
byte[] encoded = cipher.doFinal(src);//在单一方面的加密或解密
//Base64.encode(encoded);
return new String(encoded);
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}
public static void main(String[] args) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
//添加新安全算法,如果用JCE就要把它添加进去
String szSrc = "G6ZT+GxPq7JkGuLjVQ4TUAUyTcp+UnNpsoKGzy5FudtRNn6v9tSyWmxpcnFu01Rk8Th0NoV0E8TIhffliYQ4xQicG8ciVYWP2s+jk192tJrF6x6WV0ej2w==";
szSrc.getBytes("UTF-8");
System.out.println("jie密前的字符串:" + szSrc);
System.out.println("jie密后的字符串:" + decryptMode(szSrc));
//byte[] srcBytes = decryptMode(keyBytes,encoded);
//System.out.println("解密后的字符串:" + (new String(srcBytes)));
}
}