首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

DES加密(1)

2012-11-01 
DES加密(一)import cn.eaglelink.module.base.other.MessageEncryptimport java.io.FileOutputStreamimp

DES加密(一)

import cn.eaglelink.module.base.other.MessageEncrypt;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import org.apache.log4j.Logger;

/**
?* DES加密算法来加密消息xml字符串
?* @author song.li
?*
?*/
public class DESEncryptMessage implements MessageEncrypt {
?private static Logger logger = Logger.getLogger(DESEncryptMessage.class);?
//?private Key key;
?/**
?* 根据参数生成KEY
?* @param strKey
?*/
?public void saveDesKey(String strKey) {
??logger.debug("进入创建DES密钥方法...");
??Key key;
??try{
???KeyGenerator _generator = KeyGenerator.getInstance("DES");
???_generator.init(new SecureRandom(strKey.getBytes()));
???//生成密钥
???key = _generator.generateKey();
???_generator=null;
???//将密钥保存到文件中
???FileOutputStream fos = new FileOutputStream("d:/DesKey.xml");
???ObjectOutputStream oos = new ObjectOutputStream(fos);
???oos.writeObject(key);
???oos.close();???
??}catch(Exception e){
???logger.error("创建DES密钥失败!");
??}
?}
?
?/**
? *获得DES加密的密钥。在交易处理的过程中应该定时更换密钥。
? * @return kp
? */
?public static Key getKey() {
??logger.debug("进入取得DES密钥方法...");
??Key kp = null;
??try {
??String fileName = "DesKey.xml";
??InputStream is = DESEncryptMessage.class.getClassLoader().getResourceAsStream(fileName);
??ObjectInputStream oos = new ObjectInputStream(is);
??kp = (Key) oos.readObject();
??oos.close();
??}catch(Exception e){
???logger.error("取得DES密钥失败!");
??}
??return kp;
?}

?
?/**
?* 加密String明文输入,String密文输出
?* @param messageXml
?* @return
?*/
?@Override
?public String encryptMessage(String messageXml) {
??logger.debug("进入DES加密的主方法...");
??//具体实现DES加密算法来实现消息xml的加密
??byte[] byteMi = null;
??byte[] byteMing = null;
??String strMi = "";
??try {
???return byte2hex(getEncCode (messageXml.getBytes() ) );

??// byteMing = strMing.getBytes("UTF8");
??// byteMi = this.getEncCode(byteMing);
??// strMi = new String( byteMi,"UTF8");
??}catch(Exception e){
???logger.error("使用DES算法将xml字符串加密失败!");
??}finally{
???byteMing = null;
???byteMi = null;
??}
??return strMi;?
?}
?
?/**
?* 加密以byte[]明文输入,byte[]密文输出
?* @param byteS
?* @return
?*/
?private byte[] getEncCode(byte[] byteS) {
??logger.debug("进入DES加密以byte[]明文输入,byte[]密文输出方法...");
??byte[] byteFina = null;
??Cipher cipher;
??try {
???cipher = Cipher.getInstance("DES");
???cipher.init(Cipher.ENCRYPT_MODE, getKey());
???byteFina = cipher.doFinal(byteS);
??}catch(Exception e) {
???logger.error("DES加密以byte[]明文输入,byte[]密文输出失败!");
??}finally {
???cipher = null;
??}
??return byteFina;
?}
?
?/**
?* 二行制转字符串
?* @param b
?* @return
?*/
?public static String byte2hex(byte[] b) { //一个字节的数,
??logger.debug("进入二行制转字符串方法...");
??// 转成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(); //转成大写
?}
?
?/**
?* 解密 以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 byteD
?* @return
?*/
?private byte[] getDesCode(byte[] byteD) {
??Cipher cipher;
??byte[] byteFina=null;
??try{
???cipher = Cipher.getInstance("DES");
???cipher.init(Cipher.DECRYPT_MODE, getKey());
???byteFina = cipher.doFinal(byteD);
??}catch(Exception e){
???e.printStackTrace();
??}finally{
???cipher=null;
??}
??return byteFina;
?}
?
?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) {
??DESEncryptMessage des=new DESEncryptMessage();//实例化一个对像
??des.saveDesKey("aadd");//生成密匙
??String result=des.encryptMessage("helloworld");
??System.out.println("生成的密文为--result="+result);
??String result2=des.getDesString(result);
??System.out.println("解密后的原文为--result="+result2);
?}
}

热点排行