AES加密算法demo

AES簡介:

AES加密標準又稱爲高級加密標準Rijndael加密法,是美國國家標準技術研究所NIST旨在取代DES的21世紀的加密標準。AES的基本要求是,採用對稱分組密碼體制,密鑰長度可以爲128、192或256位,分組長度128位,算法應易在各種硬件和軟件上實現。

 常結合RSA使用--RSA demo介紹鏈接

demo鏈接​​​​​​​

AES加密實例

package com.fostlin.aes;

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

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class AESUtil {
    /**
     * 解密
     * @return
     */
    public static String decode(String aes_key,String data){
        try {
            //1.構造密鑰生成器,指定爲AES算法,不區分大小寫
            KeyGenerator keygen=KeyGenerator.getInstance("AES");
            //2.根據ecnodeRules規則初始化密鑰生成器
            //生成一個128位的隨機源,根據傳入的字節數組
            keygen.init(192, new SecureRandom(aes_key.getBytes()));
            //3.產生原始對稱密鑰
            SecretKey original_key=keygen.generateKey();
            //4.獲得原始對稱密鑰的字節數組
            byte [] raw=original_key.getEncoded();
            //5.根據字節數組生成AES密鑰
            SecretKey key=new SecretKeySpec(raw, "AES");
            //6.根據指定算法AES自成密碼器
            Cipher cipher=Cipher.getInstance("AES");
            //7.初始化密碼器,第一個參數爲加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二個參數爲使用的KEY
            cipher.init(Cipher.DECRYPT_MODE, key);
            //8.將加密並編碼後的內容解碼成字節數組
            byte [] byte_content= new BASE64Decoder().decodeBuffer(data);
            /*
             * 解密
             */
            byte [] byte_decode=cipher.doFinal(byte_content);
            String AES_decode=new String(byte_decode,"utf-8");
            return AES_decode;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }

        //如果有錯就返加nulll
        return null;
    }

    /**
     * 加密
     *      1.構造密鑰生成器
     *    * 2.根據ecnodeRules規則初始化密鑰生成器
     *    * 3.產生密鑰
     *    * 4.創建和初始化密碼器
     *    * 5.內容加密
     *    * 6.返回字符串
     * @return
     */
    public static String encryption(String aes_key,String data){

        try {
            KeyGenerator keygen = KeyGenerator.getInstance("AES");
            keygen.init(192,new SecureRandom(aes_key.getBytes()));//128 192 256位
            //3.產生原始對稱密鑰
            SecretKey original_key=keygen.generateKey();
            //4.獲得原始對稱密鑰的字節數組
            byte [] raw=original_key.getEncoded();
            //5.根據字節數組生成AES密鑰
            SecretKey key=new SecretKeySpec(raw, "AES");
            //6.根據指定算法AES自成密碼器
            Cipher cipher=Cipher.getInstance("AES");
            //7.初始化密碼器,第一個參數爲加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個參數爲使用的KEY
            cipher.init(Cipher.ENCRYPT_MODE, key);
            //8.獲取加密內容的字節數組(這裏要設置爲utf-8)不然內容中如果有中文和英文混合中文就會解密爲亂碼
            byte [] byte_encode=data.getBytes("utf-8");
            //9.根據密碼器的初始化方式--加密:將數據加密
            byte [] byte_AES=cipher.doFinal(byte_encode);
            //10.將加密後的數據轉換爲字符串
            String AES_encode=new BASE64Encoder().encode(byte_AES);
            //11.將字符串返回
            return AES_encode;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        String encryption = encryption("test","張三");
        System.out.println(encryption);
        String jm = decode("test",encryption);
        System.out.println(jm);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章