java 中 DES 加密算法的一个简单实现

/*
 * Created on 2005-7-7
 *
 */

/**
 * @author tianya
 *
 * 简单的DES加密算法
 */
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.security.NoSuchAlgorithmException;
import java.security.Security;
/**
 * DES加密的,文件中共有两个方法,加密、解密
 *
 */
public class DES {
    private String Algorithm = "DES";
    private KeyGenerator keygen;
    private SecretKey deskey;
    private Cipher cipher;
    private byte[] encryptorData;
    private byte[] decryptorData;

    /**
     * 初始化 DES 实例
     */
    public DES() {
          init();
    }

    /**
     * 初始化 DES 加密算法的一些参数
     */
    public void init() {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        try {
               keygen = KeyGenerator.getInstance(Algorithm);
               deskey = keygen.generateKey();
               cipher = Cipher.getInstance(Algorithm);
         }
         catch(NoSuchAlgorithmException ex){
            ex.printStackTrace();
        }
         catch(NoSuchPaddingException ex){
            ex.printStackTrace();
        }
       }

    /**
     * 对 byte[] 进行加密
     * @param datasource 要加密的数据
     * @return 返回加密后的 byte 数组
     */
     public byte[] createEncryptor(byte[] datasource) {
        try {
         cipher.init(Cipher.ENCRYPT_MODE, deskey);
             encryptorData = cipher.doFinal(datasource);
        }
        catch(java.security.InvalidKeyException ex){
            ex.printStackTrace();
        }
        catch(javax.crypto.BadPaddingException ex){
            ex.printStackTrace();
        }
        catch(javax.crypto.IllegalBlockSizeException ex){
            ex.printStackTrace();
        }
        return encryptorData;
     }
    
     /**
      * 将字符串加密
      *
     * @param datasource
     * @return
     * @throws Exception
     */
    public byte[] createEncryptor(String datasource) throws Exception{
        return createEncryptor(datasource.getBytes());
     }
    
    /**
     * 对 datasource 数组进行解密
     * @param datasource 要解密的数据
     * @return 返回加密后的 byte[]
     */
     public byte[] createDecryptor(byte[] datasource) {
        try {
         cipher.init(Cipher.DECRYPT_MODE, deskey);
           decryptorData = cipher.doFinal(datasource);
        }
        catch(java.security.InvalidKeyException ex){
            ex.printStackTrace();
        }
        catch(javax.crypto.BadPaddingException ex){
            ex.printStackTrace();
        }
        catch(javax.crypto.IllegalBlockSizeException ex){
            ex.printStackTrace();
        }
        return decryptorData;       
     }
    
     /**
      *
      * 将 DES 加密过的 byte数组转换为字符串
      *
     * @param dataByte
     * @return
     */
    public String byteToString(byte[] dataByte)
     {     
      String returnStr = null;
         BASE64Encoder be = new BASE64Encoder();
         returnStr = be.encode(dataByte);
         return returnStr;     
     }
     /**
      *
      * 将字符串转换为DES算法可以解密的byte数组
      *
     * @param dataByte
     * @return
     * @throws Exception
     */
    public  byte[] stringToByte(String datasource)throws Exception  {        
         BASE64Decoder bd = new BASE64Decoder();
         byte[] sorData = bd.decodeBuffer(datasource);
       
         return sorData;    
     }
     /**
      * 输出 byte数组
      *
     * @param data
     */
    public void printByte(byte[] data)
     {
     System.out.println("*********开始输出字节流**********");
     System.out.println("字节流: "+data.toString());
      for(int i = 0 ; i < data.length ; i++){
       System.out.println("第 "+i+"字节为:"+ data[i]);
      }
      System.out.println("*********结束输出字节流**********");
     }
   
     public static void main(String args[])throws Exception
     {
      //加密源数据
     String encryptorString = "this is a test";     

      DES des  = new DES();
      
      //加密获得的byte数组
      byte[] encryptorByte  = des.createEncryptor(encryptorString);
      
      //加密后的byte[] 转换来的字符串
      String byteToString = des.byteToString(encryptorByte);        
      
      System.out.println("加密前的数据:"+encryptorString);
      System.out.println("加密后的byte[]");
      des.printByte(encryptorByte);
      System.out.println("加密后的数据:"+byteToString);
      
      /*
       * 可以对字符串进行一系列的处理
       */
      
      //解密后的字符串
     String decryptorString = null;
     
      //将byteToString转换为原来的byte[]
      byte[] stringToByte = des.stringToByte(byteToString);
      //将stringToByte解密后的byte[]
      byte[]decryptorByte = des.createDecryptor(stringToByte);
      //解密后的byte[]转换为原来的字符串
      decryptorString = new String(decryptorByte);
      
      System.out.println("解密前的数据:"+byteToString);
      System.out.println("转换来的解密的byte[]");
      des.printByte(stringToByte);
      System.out.println("解密后的数据:"+decryptorString);
   }

     }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值