Java中AES的加密解密算法(項目中可以直接使用)

Java中AES的加密解密算法(項目中可以直接使用)
今天給大家分享一套加密解密算法,可直接使用。需要更多實用小代碼的可以關注我,我會持續更新!
package com.keenlycms.common.util;

import java.security.AlgorithmParameters;
import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Arrays;

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

public class AES128Util {

//算法名
public static final String KEY_ALGORITHM = "AES";
//加解密算法/模式/填充方式
//可以任意選擇,爲了方便後面與iOS端的加密解密,採用與其相同的模式與填充方式
//ECB模式只用密鑰即可對數據進行加密解密,CBC模式需要添加一個參數iv
public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";

//生成密鑰
private static byte[] generateKey(String aesKey) throws Exception{
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    
    /*
    KeyGenerator kgen =KeyGenerator.getInstance(KEY_ALGORITHM);
    kgen.init(128, new SecureRandom(aesKey.getBytes()));
	SecretKey secretKey = kgen.generateKey();
	byte[] encodeFormat = secretKey.getEncoded();
	SecretKeySpec keySpec = new SecretKeySpec(encodeFormat, "AES");
    return keySpec.getEncoded();
    */
    return aesKey.getBytes();
}
 
//生成iv
private static AlgorithmParameters generateIV(String ivVal) throws Exception{
    //iv 爲一個 16 字節的數組,這裏採用和 iOS 端一樣的構造方法,數據全爲0
    //byte[] iv = new byte[16];
    //Arrays.fill(iv, (byte) 0x00);
    //Arrays.fill(iv,ivVal.getBytes());
    byte[]iv=ivVal.getBytes();
    AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_ALGORITHM);
    params.init(new IvParameterSpec(iv));
    return params;
}
 
//轉化成JAVA的密鑰格式
private static Key convertToKey(byte[] keyBytes) throws Exception{
    SecretKey secretKey = new SecretKeySpec(keyBytes,KEY_ALGORITHM);
    return secretKey;
}
 
//加密
public static String encrypt(String plainText,String aesKey,String ivVal) throws Exception {
	byte[] data=plainText.getBytes();
	AlgorithmParameters iv=generateIV(ivVal);
	byte[] keyBytes = generateKey(aesKey);
	//轉化爲密鑰
    Key key = convertToKey(keyBytes);
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    //設置爲加密模式
    cipher.init(Cipher.ENCRYPT_MODE, key,iv);
    byte[] encryptData= cipher.doFinal(data);
    return bytesToHexString(encryptData);
}
 
//解密
public static String decrypt(String encryptedStr,String aesKey,String ivVal) throws Exception{
	byte[] encryptedData=hexStringToByte(encryptedStr);
	byte[] keyBytes = generateKey(aesKey);
	Key key = convertToKey(keyBytes);
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    AlgorithmParameters iv=generateIV(ivVal);
    //設置爲解密模式
    cipher.init(Cipher.DECRYPT_MODE, key,iv);
    byte[] decryptData=cipher.doFinal(encryptedData);
    return new String(decryptData);
}



/**
 * 十六進制字符串轉換成數組
 * @param hex
 * @return
 */
private static byte[] hexStringToByte(String hex) {   
    int len = (hex.length() / 2);   
    byte[] result = new byte[len];   
    char[] achar = hex.toCharArray();   
    for (int i = 0; i < len; i++) {   
     int pos = i * 2;   
     result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));   
    }   
    return result;   
}  

private static byte toByte(char c) {   
    byte b = (byte) "0123456789abcdef".indexOf(c);   
    return b;   
}  
  

/** 
 * 把字節數組轉換成16進制字符串  
 * @param bArray  
 * @return  
 */   
private static final String bytesToHexString(byte[] bArray) {   
     StringBuffer sb = new StringBuffer(bArray.length);   
     String sTemp;   
     for (int i = 0; i < bArray.length; i++) {   
      sTemp = Integer.toHexString(0xFF & bArray[i]);   
      if (sTemp.length() < 2)   
       sb.append(0);   
      sb.append(sTemp.toLowerCase());   
     }   
     return sb.toString();   
 }  
 
public static void main(String[] args) {
    //明文
    String plainTextString = "B5F7E21EAB2C6FE119DD9AC5E38187A5";
    System.out.println("明文 : "+plainTextString);
    String aesKey="S9u978Q31NGPGc5H";
    String ivVal="X83yESM9iShLxfwS";
    try {
        //進行加密
        String encryptedData = encrypt(plainTextString, aesKey,ivVal);
        //輸出加密後的數據
        System.out.println("加密後的數據 : ");
        System.out.println(encryptedData);
        System.out.println();
        String data = AES128Util.decrypt(encryptedData, aesKey,ivVal);
        System.out.println("解密得到的數據 : " + data);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

}在這裏插入圖片描述

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