u011699905
zhangzheng1201
2015-11-26 06:51

java 3DES 解密时部分乱码

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)));
    }
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

相关推荐