java中加密算法的应用一:DES

第一种DES加密算法

import java.security.Key;
 
import java.security.SecureRandom;
 
import javax.crypto.Cipher;
 
import javax.crypto.KeyGenerator;
 
 
/**
*
* 使用DES加密与解密,可对byte[],String类型进行加密与解密 密文可使用String,byte[]存储.
*
* 方法: void getKey(String strKey)从strKey的字条生成一个Key
*
* String getEncString(String strMing)对strMing进行加密,返回String密文 String
* getDesString(String strMi)对strMin进行解密,返回String明文
*
* byte[] getEncCode(byte[] byteS)byte[]型的加密 byte[] getDesCode(byte[]
* byteD)byte[]型的解密
*/
 
 
public class DesEncrypt {
    Key key;
    /**
     * 根据参数生成KEY
     *
     * @param strKey
     */
 
    public void getKey(String strKey) {
        try {
            KeyGenerator _generator = KeyGenerator.getInstance("DES");
            _generator.init(new SecureRandom(strKey.getBytes()));
            this.key = _generator.generateKey();
            _generator = null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
 
    /**
     * 加密String明文输入,String密文输出
     *
     * @param strMing
     * @return
     */
 
    public String getEncString(String strMing) {
        byte[] byteMi = null;
        byte[] byteMing = null;
        String strMi = "";
        try {
            return byte2hex(getEncCode(strMing.getBytes()));
            // byteMing = strMing.getBytes("UTF8");
            // byteMi = this.getEncCode(byteMing);
            // strMi = new String( byteMi,"UTF8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            byteMing = null;
            byteMi = null;
        }
        return strMi;
    }
 
 
    /**
* 解密 以String密文输入,String明文输出
     *
     * @param strMi
     * @return
     */
 
    public String getDesString(String strMi) {
        byte[] byteMing = null;
        byte[] byteMi = null;
        String strMing = "";
        try {
            return new String(getDesCode(hex2byte(strMi.getBytes())));
            // byteMing = this.getDesCode(byteMi);
            // strMing = new String(byteMing,"UTF8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            byteMing = null;
            byteMi = null;
        }
        return strMing;
    }
 
 
    /**
     * 加密以byte[]明文输入,byte[]密文输出
     *
     * @param byteS
     * @return
     */
 
    private byte[] getEncCode(byte[] byteS) {
        byte[] byteFina = null;
        Cipher cipher;
        try {
            cipher = Cipher.getInstance("DES");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byteFina = cipher.doFinal(byteS);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cipher = null;
        }
        return byteFina;
    }
    
    /**
     * 解密以byte[]密文输入,以byte[]明文输出
     *
     * @param byteD
     * @return
     */
 
private byte[] getDesCode(byte[] byteD) {
        Cipher cipher;
        byte[] byteFina = null;
        try {
            cipher = Cipher.getInstance("DES");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byteFina = cipher.doFinal(byteD);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cipher = null;
        }
        return byteFina;
    }
    /**
     * 二行制转字符串
     *
     * @param b
     * @return
     */
 
    public static String byte2hex(byte[] b) { // 一个字节的数,
    // 转成16进制字符串
        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;
        }
        return hs.toUpperCase(); // 转成大写
    }
 
 
    public static byte[] hex2byte(byte[] b) {
        if ((b.length % 2) != 0)
            throw new IllegalArgumentException("长度不是偶数");
        byte[] b2 = new byte[b.length / 2];
        for (int n = 0; n < b.length; n += 2) {
            String item = new String(b, n, 2);
            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个进制字节
            b2[n / 2] = (byte) Integer.parseInt(item, 16);
        }
        return b2;
    }
 
    public static void main(String[] args) {
        System.out.println("----------------------start--------------------");
        DesEncrypt des = new DesEncrypt();//实例化一个对像
        des.getKey("13308472157"); //生成密钥
        String strEnc = des.getEncString("oracle.jdbc.driver.OracleDriver"); //加密字符串,返回String的密文
        System.out.println(strEnc); //打印加密后的信息
        String strDes = des.getDesString(strEnc); //把String 类型的密文解密
        System.out.println(strDes); //解密后的信息
        System.out.println("----------------------end--------------------");
    }
 
}
 

第二中DES加密算法

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
 
package MyChat;
 
import java.security.*;
import javax.crypto.*;
 
public class DESPlus {
private static String strDefaultKey = "kk";
 
private Cipher encryptCipher = null;
 
private Cipher decryptCipher = null;
 
/**
* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStr2ByteArr(String strIn) 互为可逆的转换过程
*
* @param arrB
*            需要转换的byte数组
* @return 转换后的字符串
* @throws Exception
*             本方法不处理任何异常,所有异常全部抛出
*/
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
   int intTmp = arrB[i];
   // 把负数转换为正数
   while (intTmp < 0) {
    intTmp = intTmp + 256;
   }
   // 小于0F的数需要在前面补0
   if (intTmp < 16) {
    sb.append("0");
   }
   sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
 
/**
* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
* 互为可逆的转换过程
*
* @param strIn
*            需要转换的字符串
* @return 转换后的byte数组
* @throws Exception
*             本方法不处理任何异常,所有异常全部抛出
* @author LiGuoQing
*/
public static byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
 
// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
   String strTmp = new String(arrB, i, 2);
   arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}
 
/**
* 默认构造方法,使用默认密钥
*
* @throws Exception
*/
public DESPlus() throws Exception {
this(strDefaultKey);
}
 
/**
* 指定密钥构造方法
*
* @param strKey
*            指定的密钥
* @throws Exception
*/
public DESPlus(String strKey) throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
 
encryptCipher = Cipher.getInstance("DES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
 
decryptCipher = Cipher.getInstance("DES");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
 
/**
* 加密字节数组
*
* @param arrB
*            需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
public byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}
 
/**
* 加密字符串
*
* @param strIn
*            需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
}
 
/**
* 解密字节数组
*
* @param arrB
*            需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
public byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}
 
/**
* 解密字符串
*
* @param strIn
*            需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
return new String(decrypt(hexStr2ByteArr(strIn)));
}
 
/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
*            构成该字符串的字节数组
* @return 生成的密钥
* @throws java.lang.Exception
*/
private Key getKey(byte[] arrBTmp) throws Exception {
// 创建一个空的8位字节数组(默认值为0)
byte[] arrB = new byte[8];
 
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
   arrB[i] = arrBTmp[i];
}
 
// 生成密钥
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
 
return key;
}
}
 
//测试程序 Test.java
//
///**
// * @author    李国庆
// * @company   leemenz (C) copyright
// * @time      Nov 1, 2006 10:24:06 AM
// * @version   1.0.0.0
// * @package   com.des
// */
//package com.des;
//
///**
// * @author Administrator
// *
// */
//public class Test {
//
// /**
// * @param args
// */
// public static void main(String[] args) {
// // TODO Auto-generated method stub
// try {
//   String test = "Hellow Word!";
//   //DESPlus des = new DESPlus();//默认密钥
//   DESPlus des = new DESPlus("leemenz");//自定义密钥
//   System.out.println("加密前的字符:"+test);
//   System.out.println("加密后的字符:"+des.encrypt(test));
//   System.out.println("解密后的字符:"+des.decrypt(des.encrypt(test)));
// } catch (Exception e) {
//   // TODO: handle exception
//   e.printStackTrace();
// }
// }
//}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值