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);
}
}