DES加密

     DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法,下面是java提供的des算法实现加密工具类:


import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class DesEncrypter {
 
 public static final String TRANSFORMATION="DES";
 
 public static final String ENCODING="UTF-8";
 
 public static final int KEY_LEN=16;
 
 private Cipher ecipher=null;
 private Cipher dcipher=null;
 private SecretKey key = null;
 
 //构造函数,使用系统随机生成的密钥
 public DesEncrypter(){
  if(key==null){
   try {
    key=KeyGenerator.getInstance(TRANSFORMATION).generateKey();
   } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
   }
  }
  init();
 }


  //构造函数,使用自定义的密钥,此密钥可用于解密
 public DesEncrypter(String key){
  setSecretKey(key);
 }
 
 
 
 private void init(){
  try {
   ecipher=Cipher.getInstance(TRANSFORMATION);
   dcipher=Cipher.getInstance(TRANSFORMATION);
   ecipher.init(Cipher.ENCRYPT_MODE, key);
   dcipher.init(Cipher.DECRYPT_MODE, key);
  } catch (Exception e) {
   e.printStackTrace();
  }
  
 }
 
 //加密函数 str为要加密的字符
 @SuppressWarnings("finally")
 public String encrypt(String str){
  if(str==null){
   return null;
  }
  String encryptedText=null;
  try{
   byte[] temp=str.getBytes(ENCODING);
   byte[] enc=ecipher.doFinal(temp);
   encryptedText="";
   for(int i=0;i<enc.length;i++){
    encryptedText +=byteToHex(enc[i]);
   }
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   return encryptedText;
  }
 }

 


//解密函数,str为需解密的数据 
 @SuppressWarnings("finally")
 public String decrypt(String str){
  if(str == null){
   return null;
  }
  String decryptedText=null;
  try{
   int length=str.length()/2;
   byte[] dec = new byte[length];
   for(int i=0;i<length;i++){
    dec[i]=hexToByte(str.substring(2*i,2*i+2));
   }
   byte[] temp=dcipher.doFinal(dec);
   decryptedText=new String(temp,ENCODING);
  }catch(Exception e){
   
  }finally{
   return decryptedText;
  }
 }
 
 private String byteToHex(byte ib){
  char[] Digit={
    '0','1','2','3','4','5','6','7','8','9',
    'a','b','c','d','e','f'
  };
  char[] ob=new char[2];
  ob[0]=Digit[(ib>>>4)&0X0F];
  ob[1]=Digit[ib&0X0F];
  String s=new String(ob);
  return s;
 }
 
 private byte hexToByte(String str){
  byte ib=0;
  char[] c=str.toCharArray();
  try{
   ib=Byte.decode("0x"+c[0]).byteValue();
   ib<<=4;
   ib|=Byte.decode("0x"+c[1]).byteValue();
  }catch(NumberFormatException nfe){
   return 0;
  }
  return ib;
 }
 
 private String bytesToHex(byte[] bytes){
  StringBuffer sb=new StringBuffer();
  for(int i=0;i<bytes.length;i++){
   sb.append(byteToHex(bytes[i]));
  }
  return sb.toString();
 }
 
 
 public String getSecretKey(){
  String skey=null;
  if(key!=null){
   skey="";
   byte[] temp=key.getEncoded();
   for(int i=0;i<temp.length;i++){
    skey+=byteToHex(temp[i]);
   }
  }
  return skey;
 }
 
 public void setSecretKey(String skey){
  int length=skey.length();
  StringBuffer stringbuffer = new StringBuffer();
     stringbuffer.append(bytesToHex(skey.getBytes()));
     if (stringbuffer.length() <= KEY_LEN) {
       long l1 = KEY_LEN - stringbuffer.length();
       for (int k = 0; k < l1; ++k) {
         stringbuffer.insert(0, "0");
       }
       skey = stringbuffer.toString();
     }
     else {
      skey = stringbuffer.substring(stringbuffer.length() - KEY_LEN);
     }
     length=skey.length();
  length/=2;
  byte[] bkey=new byte[length];
  for(int i=0;i<length;i++){
   bkey[i]=hexToByte(skey.substring(2*i, 2*i+2));
  }
  key=new SecretKeySpec(bkey,TRANSFORMATION);
  init();
 }
 
 public void setSecretKey1(String skey){
  int length=skey.length();
  if(length%2!=0){
    return;
  }
  length/=2;
  byte[] bkey=new byte[length];
  for(int i=0;i<length;i++){
   bkey[i]=hexToByte(skey.substring(2*i, 2*i+2));
  }
  key=new SecretKeySpec(bkey,TRANSFORMATION);
  init();
 }
 
}

 

 

使用方法,

DesEncrypter des=new DesEncrypter("xumian");

//加密

String enStr=des.encrypt("need to encrypt");

//解密

String deStr=des.decrypt(enStr);

System.out.println(deStr);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值