java使用DES加密方式,實現對資料的加密解密

資料架構師發表於2017-10-07

全棧工程師開發手冊 (作者:欒鵬)

java教程全解

java使用DES加密方式,實現對資料的加密解密。加密和解密中需要使用同一個祕鑰

第一種方式,使用型別Key作為加密解密的共同祕鑰。

測試程式碼

public static void main(String[] args) 
    {
        try {
            DESDemo des=new DESDemo();
            des.generateKey();
            byte[] data="Hello World!".getBytes();
            byte[] data1=des.des_encrypt(data);  //加密
            byte[] data2=des.des_dencrypt(data1);  //解密
            String back=new String(data2);
            System.out.println(back);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

DES加密解密工具類的實現

package com.lp.app.safe;
import java.security.*;
import javax.crypto.*;
public class DESDemo {

    Key key;
    //產生祕鑰
    public void generateKey() throws Exception {
        // 得到DES私鑰
        KeyGenerator keyGen = KeyGenerator.getInstance("DES");
        keyGen.init(56);
        key = keyGen.generateKey();
    }

    //des加密,輸入明文位元組流
    public byte[] des_encrypt(byte[] plainText) throws Exception {
        // 得到DES cipher 物件
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        // 使用金鑰對明文進行加密
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] cipherText = cipher.doFinal(plainText);
        return cipherText;
    }

    //des解密
    public byte[] des_dencrypt(byte[] cipherText) throws Exception {
        // 使用同一把金鑰對密文進行解密
        // 得到DES cipher 物件
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] newPlainText = cipher.doFinal(cipherText);
        return newPlainText;
    }
}

第二種方式,使用位元組陣列byte[]作為加密解密的共同祕鑰

測試程式碼

 public static void main(String[] args) {

        String str1="12014-11-15";
         // DES資料加密  
        String s1=encryptBasedDes(str1);
        System.out.println("加密後"+s1);  

        // DES資料解密  
        String s2=decryptBasedDes(s1);  
        System.out.println("解密後"+s2);  
    }

加密解密工具類的實現

package com.lp.app.util;

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;



public class DESUtil {


    //演算法密匙
    private static final byte[] DES_KEY = { 21, 1, -110, 82, -32, -85, -128, -65 };  

    //資料加密,演算法(DES)  
    public static String encryptBasedDes(String data) {  
        String encryptedData = null;  
        try {  
            // DES演算法要求有一個可信任的隨機數源  
            SecureRandom sr = new SecureRandom();  
            DESKeySpec deskey = new DESKeySpec(DES_KEY);  
            // 建立一個密匙工廠,然後用它把DESKeySpec轉換成一個SecretKey物件  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            SecretKey key = keyFactory.generateSecret(deskey);  
            // 加密物件  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.ENCRYPT_MODE, key, sr);  
            // 加密,並把位元組陣列編碼成字串  
            encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));  
        } catch (Exception e) {  
//            log.error("加密錯誤,錯誤資訊:", e);  
            throw new RuntimeException("加密錯誤,錯誤資訊:", e);  
        }  
        return encryptedData;  
    }  

    //解密(DES)  
    public static String decryptBasedDes(String cryptData) {  
        String decryptedData = null;
        try {  
            // DES演算法要求有一個可信任的隨機數源  
            SecureRandom sr = new SecureRandom();  
            DESKeySpec deskey = new DESKeySpec(DES_KEY);  
            // 建立一個密匙工廠,然後用它把DESKeySpec轉換成一個SecretKey物件  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            SecretKey key = keyFactory.generateSecret(deskey);  
            // 解密物件  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.DECRYPT_MODE, key, sr);  
            // 把字串解碼為位元組陣列,並解密  
            decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData)));  
        } catch (Exception e) {  
//            log.error("解密錯誤,錯誤資訊:", e);  
            throw new RuntimeException("解密錯誤,錯誤資訊:", e);  
        }  
        return decryptedData;  
    }  


}

相關文章