注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

3des加密,base64,url加密  

2010-12-31 16:10:21|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
想用3des加密,因为有不可见字符所以有问题所以在3des上做了base64编码,后来需要url传参所以加了url编码
Encrypt.java
 /**
 *
 */
package des3;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 加密解密工具类
 * @author wanggang
 * @version 2010-12-31
 */
public class Encrypt {
    private static final Log log = LogFactory.getLog(Encrypt.class);
    
    /***
     * 加密密钥
     */
    final static byte[] keyBytes = { 0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x09,
            0x40, 0x38, 0x74, 0x25, (byte) 0x99, 0x21, (byte) 0xCB, (byte) 0xDD,
            0x58, 0x66, 0x77, 0x22, 0x74, (byte) 0x98, 0x30, 0x40, 0x36,
            (byte) 0xE2 }; // 24字节的密钥
    /**
     * 加密方法提供3des加密,并且base64编码
     * @param key 24字节的密钥
     * @param str 明文
     * @return
     */
    public static String DataEncrypt(byte[] key, String str ) {
        String encrypt = null;
        try {
            byte[] ret = ThreeDes.encryptMode(key,str.getBytes("UTF-8"));

            encrypt = new String(Base64Util.encode(ret));
        } catch (Exception e) {
            System.out.print(e);
            encrypt = str;
        }
        return encrypt;
    }
    /***
     * 解密方法,先解密base64,在按3des解密
     * @param key 24字节的密钥
     * @param str 密文
     * @return
     */
    public static String DataDecrypt(byte[] key,String str ) {
        String decrypt = null;
        try {
            byte[] ret = ThreeDes.decryptMode( key,Base64Util.decode(str));
            decrypt = new String(ret, "UTF-8");
        } catch (Exception e) {
            System.out.print(e);
            decrypt = str;
        }
        return decrypt;
    }
    
    /***
     * 使用默认密钥,3des编码,base64编码,url编码
     * @param str 明文
     * @return 密文
     */
    public static String encodeUrl(String str){
        
        String encoded = DataEncrypt(keyBytes,str );
        try {
            encoded = URLEncoder.encode(encoded, "utf-8");
        } catch (UnsupportedEncodingException e) {
        
        }
        return encoded;
        
    }
    public static String encodeUrl(byte[] key,String str){
        
        String encoded = DataEncrypt(key,str );
        try {
            encoded = URLEncoder.encode(encoded, "utf-8");
        } catch (UnsupportedEncodingException e) {
        
        }
        return encoded;
        
    }
    /**
     * 使用默认密钥解密方法,url解码,base64解码,3des解码
     * @param str 密文
     * @return 明文
     */
    public static String decodeUrl(String str){
        
        String encoded = "";
        try {
            encoded = URLDecoder.decode(str, "utf-8");
        } catch (UnsupportedEncodingException e) {
        
        }
         encoded = DataDecrypt(keyBytes,encoded );
        return encoded;
        
    }
    public static String decodeUrl(byte[] key,String str){
        
        String encoded = "";
        try {
            encoded = URLDecoder.decode(str, "utf-8");
        } catch (UnsupportedEncodingException e) {
        
        }
         encoded = DataDecrypt(key,encoded );
        return encoded;
        
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        String str = "b=2010-12-20&c=299930&type=3";
        System.out.println(str);
        str = Encrypt.encodeUrl(keyBytes,str);
        System.out.println(str);
        str = Encrypt.decodeUrl(keyBytes,str);
        System.out.println(str);
    }

}

  
ThreeDes.java
 /**
 *
 */
package des3;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

/**
 * 字符串 DESede(3DES) 加密
 * @author wanggang
 * @version 2010-12-31
 */
public class ThreeDes {
    private static final String Algorithm = "DESede"; // 定义 加密算法,可用
                                                        // DES,DESede,Blowfish

    // keybyte为加密密钥,长度为24字节
    // src为被加密的数据缓冲区(源)
    public static byte[] encryptMode(byte[] keybyte, byte[] src) {
        try {
            // 生成密钥
            SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
            // 加密
            Cipher c1 = Cipher.getInstance(Algorithm);
            c1.init(Cipher.ENCRYPT_MODE, deskey);
            return c1.doFinal(src);
        } catch (java.security.NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (javax.crypto.NoSuchPaddingException e2) {
            e2.printStackTrace();
        } catch (java.lang.Exception e3) {
            e3.printStackTrace();
        }
        return null;
    }

    // keybyte为加密密钥,长度为24字节
    // src为加密后的缓冲区
    public static byte[] decryptMode(byte[] keybyte, byte[] src) {
        try {
            // 生成密钥
            SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
            // 解密
            Cipher c1 = Cipher.getInstance(Algorithm);
            c1.init(Cipher.DECRYPT_MODE, deskey);
            return c1.doFinal(src);
        } catch (java.security.NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (javax.crypto.NoSuchPaddingException e2) {
            e2.printStackTrace();
        } catch (java.lang.Exception e3) {
            e3.printStackTrace();
        }
        return null;
    }

    /** 转换成十六进制字符串*/
    public static String byte2hex(byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1)
                hs = hs + "0" + stmp;
            else
                hs = hs + stmp;
            if (n < b.length - 1)
                hs = hs + ":";
        }
        return hs.toUpperCase();
    }

    public static void main(String[] args) {

        // 添加新安全算法,如果用JCE就要把它添加进去
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        /*byte[] keyBytes = { 0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x10,
                0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD,
                0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36,
                (byte) 0xE2 }; // 24字节的密钥
*/        System.out.println(0x88);
        System.out.println((byte)0x88);
        String key = "12345678qwertyui87654321";
        byte[] keyBytes = key.getBytes();
        String szSrc="http://1985wanggang.blog.163.com/blog/abcdefgh";
        System.out.println("加密前的字符串:" + szSrc);

        byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());
        
        System.out.println("加密后的字符串:" + new String( encoded));
        byte[] decode = decryptMode(keyBytes, encoded);
        System.out.println("解密后的字符串:" + new String(decode));
        
    }

}

  
Base64Util.java
 /**
 *
 */
package des3;

/**
 * base64编码工具类
 * @author wanggang
 * @version 2010-12-31
 */
public class Base64Util {

    /**
     *  将 s 进行 BASE64 编码
     * @param s
     * @return
     */
    public static String encode(byte[] s) {
        if (s == null)
            return null;
        return (new sun.misc.BASE64Encoder()).encode(s);
    }
    /**
     *  将 s 进行 BASE64 编码
     * @param s
     * @return
     */
    public static String encode(String s) {
        
        if (s == null)
            return null;
        return encode(s.getBytes());
    }

    /**将 BASE64 编码的字符串 s 进行解码
     *
     * @param s
     * @return
     */
    public static byte[] decode(String s) {
        if (s == null)
            return null;
        sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
        try {
            byte[] b = decoder.decodeBuffer(s);
            return b;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a = "asdfsfsd";
        String b = encode(a);
        System.out.println(b);
        System.out.println(decode(b));

    }

}



主要上面的url中包含%+=等特殊字符,如果遇到传参转码问题,可以考虑用 下面的文章处理
  评论这张
 
阅读(3439)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016