3des解密乱码问题

zhangzheng1201 2015-11-28 09:12:01
最近遇到了一个3DES解密乱码的问题,明文是由银行加密后传过来的 ,解密是的时候总是部分乱码,查找原因,发现解密以后的byte数组里有负值,造成了无法找到对应的ASCII字符,大神们帮我看看这是什么问题。 上代码:


import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Arrays;

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 Test {

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%2BGxPq7JkGuLjVQ4TUAUyTcp%2BUnNpsoKGzy5FudtRNn6v9tSyWmxpcnFu01Rk8Th0NoV0E8TIhffliYQ4xQicG8ciVYWP2s%2Bjk192tJrF6x6WV0ej2w%3D%3D";


System.out.println("jie密前的字符串:" + URLDecoder.decode(szSrc, "utf-8"));

System.out.println("jie密后的字符串:" + decryptMode(URLDecoder.decode(szSrc, "utf-8")));

//byte[] srcBytes = decryptMode(keyBytes,encoded);
//System.out.println("解密后的字符串:" + (new String(srcBytes)));
}
}
...全文
138 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧