JAVA使用DES加密解密
在使用DES加密解密的时候,遇到了一些问题,廖记一下。如有哪位大神亲临留言指点,不胜感激。
先上代码:
public DESUtil() {
    }
    //密码,长度要是8的倍数    注意此处为简单密码  简单应用 要求不高时可用此密码
  /*DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,
后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,
24小时内即可被破解。*/
    private static String password = "9588888888880288";
    //测试
    public static void main(String args[]) {
       //待加密内容
        String str = "task_id=TSK_000000006870&ledger_id=0715-5572";
        String result = DESUtil.encrypt(str);
        BASE64Encoder base64en = new BASE64Encoder();
//        String strs = new String(base64en.encode(result));
        System.out.println("加密后:"+result);
        //直接将如上内容解密
        try {
            String decryResult = DESUtil.decryptor(result);
            System.out.println("解密后:"+new String(decryResult));
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
    /**
     *
     * @Method: encrypt
     * @Description: 加密数据
     * @param data
     * @return
     * @throws Exception
     * @date 2016年7月26日
     */
    public static String encrypt(String data) {  //对string进行BASE64Encoder转换
        byte[] bt = encryptByKey(data.getBytes(), password);
        BASE64Encoder base64en = new BASE64Encoder();
        String strs = new String(base64en.encode(bt));
        return strs;
    }
    /**
     *
     * @Method: encrypt
     * @Description: 解密数据
     * @param data
     * @return
     * @throws Exception
     * @date 2016年7月26日
     */
    public static String decryptor(String data) throws Exception {  //对string进行BASE64Encoder转换
        sun.misc.BASE64Decoder base64en = new sun.misc.BASE64Decoder();
        byte[] bt = decrypt(base64en.decodeBuffer(data), password);
        String strs = new String(bt);
        return strs;
    }
    /**
     * 加密
     * @param datasource byte[]
     * @param password String
     * @return byte[]
     */
    private static byte[] encryptByKey(byte[] datasource, String key) {
        try{
            SecureRandom random = new SecureRandom();
            DESKeySpec desKey = new DESKeySpec(key.getBytes());
            //创建一个密匙工厂,然后用它把DESKeySpec转换成
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey securekey = keyFactory.generateSecret(desKey);
            //Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance("DES");
            //用密匙初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
            //现在,获取数据并加密
            //正式执行加密操作
            return cipher.doFinal(datasource);
        }catch(Throwable e){
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 解密
     * @param src byte[]
     * @param password String
     * @return byte[]
     * @throws Exception
     */
    private static byte[] decrypt(byte[] src, String key) throws Exception {
        // DES算法要求有一个可信任的随机数源
        SecureRandom random = new SecureRandom();
        // 创建一个DESKeySpec对象
        DESKeySpec desKey = new DESKeySpec(key.getBytes());
        // 创建一个密匙工厂
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        // 将DESKeySpec对象转换成SecretKey对象
        SecretKey securekey = keyFactory.generateSecret(desKey);
        // Cipher对象实际完成解密操作
        Cipher cipher = Cipher.getInstance("DES");
        // 用密匙初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, securekey, random);
        // 真正开始解密操作
        return cipher.doFinal(src);
    }
解密过程中总有各种异常,有的说 SecureRandom 有问题需要换个方式生产随机数。具体异常忘了记录,但几番调试之后,感觉应该不是 SecureRandom 的问题,就继续使用了。
还有个问题是乱码。DES加密之后总会产生以下乱乱的字符,迫不得已用 BASE64 再包一层吧。但还是会产生像 “+” 什么的字符,这些字符在某些浏览器上会被屏蔽。呜呼哀哉,只得再 URLDecode 一下。
String DESParam = DESUtil.encrypt(param);
DESParam = URLEncoder.encode(URLEncoder.encode(DESParam, "UTF-8"),"UTF-8");
urlString += "?"+DESParam;
String longToShortUrl = sinaShortUrl + "?source=" + sinaShortUrlKey + "&url_long=" + urlString;
解密之前需要再解一下
param = URLDecoder.decode(param, "UTF-8");
String decodeParam = DESUtil.decryptor(param);
哦了。
最常见的问题是解码时,
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at com.**.resbook.util.DESUtil.decrypt(DESUtil.java:117)
at com.**.resbook.util.DESUtil.decryptor(DESUtil.java:66)
at com.**.resbook.util.DESUtil.main(DESUtil.java:32)
意思是说解密的密码必须是8的倍数什么的,个人感觉大多是加密之后的数据被改动了,导致解密失败。
另外确实有的错误原因是因为密码的选择失误。
JAVA使用DES加密解密的更多相关文章
- 一个java的DES加密解密类转换成C#
		一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.P ... 
- 兼容PHP和Java的des加密解密代码分享
		这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ... 
- java 实现 DES加密 解密算法
		DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ... 
- Android和java平台 DES加密解密互通程序及其不能互通的原因
		网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DES 加密和java DES加密的程序不能互通.就是加密的结果不一样 ... 
- JAVA的DES加密解密在windows上测试一切正常,在linux上异常
		windows上加解密正常,linux上加密正常,解密时发生 如下异常,异常信息如下: [ERROR] 2018-10-15 09:30:35,998 method:com.iscas.ippc.co ... 
- 一个java的DES加解密类转换成C#
		原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ... 
- des加密解密——java加密,php解密
		最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ... 
- C#用DES加密JAVA用DES解密,JAVA用DES加密C#用DES解密的实现
		这里贴出来的是可通用的C#与jav的DES加密类,希望对大家管用直接复制即可用 C#DES加密解密类 ///<summary><![CDATA[加密解密帮助类]]></s ... 
- 【DES加密解密】  C#&JAVA通用
		DES加密解密 C# Code /// <summary> /// DES加密解密帮助类 /// </summary> public static class DESHelpe ... 
随机推荐
- ARM处理器的运行模式
			ARM处理器的7种运行模式 用户模式( usr ):ARM处理器正常的程序执行状态: 快速中断模式( fiq ):用于高速数据传输或通道处理: 外部中断模式( irq):用于通常的中断处理: 管理模式 ... 
- java - day13 - UnionPay
			银行功能实现,主要为抽象类及接口的运用 package com.javatest.bankimple; /* UnionPay */ //银联接口 public interface UnionPay ... 
- SQL注入-数据库判断
			0x01.sql注入 sql注入是在系统开发的过程中程序员编程不规范,我们可以通过把SQL语句插入到WEB表单中进行查询字符串,最终达成欺骗服务器执行恶意的SQL命令.对于现在的网站SQL注入越来越严 ... 
- IPBX和话机对接
			某厂家的话机和IPBX进行对接问题: 1. 该话机作为主叫方,呼叫能够正常建立 2. 该话机作为被叫方.呼叫无法建立,IPBX发送INVITE消息给该话机,该话机回复400 具体消 ... 
- VLC Web插件的浏览器兼容性
			网页插件实现原理 IE浏览器基于Activex插件来实现,非IE浏览器采用NPAPI来实现,所以,非浏览器需要支持NPAPI来实现. IE浏览器 FF浏览器(版本小于52) 原因从 Firefox 版 ... 
- Web Services 概要
			WSDL WSDL 是基于 XML 的用来描述 Web services 以及如何访问它们的一种语言. WSDL 可描述 web service,连同用于 web service 的消息格式和协议的细 ... 
- Openstack(Kilo)安装系列之环境准备(二)
			控制节点.网络节点.计算节点: 一.配置源 1.配置EPEL源 yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-rel ... 
- 安装VC6.0遇到的问题
			1. 问题现象 安装VC6.0后,又安装了VS2005.用VC6.0打开以前的.dsw文件时,程序自动关闭.如下图所示. 具体操作是:选择一个.dsw文件,右键菜单[打开方式]中选择[Microsof ... 
- js array filter pop push shift unshift方法
			JavaScript Array filter() 方法 JavaScript Array 对象 实例 返回数组 ages 中所有元素都大于 18 的元素: var ages = [32, 33, ... 
- python3----冒泡排序
			array = [1, 6, 7, 2, 9, 4] for i in range(len(array)-1, 1, -1): for j in range(0, i): if array[j] &g ... 
