java基于AES對稱加密算法實(shí)現(xiàn)的加密與解密功能示例
本文實(shí)例講述了java基于AES對稱加密算法實(shí)現(xiàn)的加密與解密功能。分享給大家供大家參考,具體如下:
package com.soufun.com;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Date;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* @author WHD
*/
public class AesUtil {
private static final String AES="AES";
private static final String UTF8="UTF-8";
static KeyGenerator kgen =null;
static{
try {
kgen= KeyGenerator.getInstance(AES);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* @param content:
* @param password:
*/
private static byte[] encrypt(String content, String password) {
try {
// 使用靜態(tài)代碼塊來生成KeyGenerator對象
//KeyGenerator kgen = KeyGenerator.getInstance(AES);
// 使用128 位
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] encodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);
// Cipher對象實(shí)際完成加密操作
Cipher cipher = Cipher.getInstance(AES);
// 加密內(nèi)容進(jìn)行編碼
byte[] byteContent = content.getBytes(UTF8);
// 用密匙初始化Cipher對象
cipher.init(Cipher.ENCRYPT_MODE, key);
// 正式執(zhí)行加密操作
byte[] result = cipher.doFinal(byteContent);
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/*
* @param content:
* @param password:
*/
private static byte[] decrypt(byte[] content, String password) {
try {// 使用靜態(tài)代碼塊來生成KeyGenerator對象
//KeyGenerator kgen = KeyGenerator.getInstance(AES);
// 使用128 位
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] encodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);
// Cipher對象實(shí)際完成加密操作
Cipher cipher = Cipher.getInstance(AES);
// 用密匙初始化Cipher對象
cipher.init(Cipher.DECRYPT_MODE, key);
// 正式執(zhí)行解密操作
byte[] result = cipher.doFinal(content);
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/**
* 二進(jìn)制--》十六進(jìn)制轉(zhuǎn)化
* @param buf
* @return
*/
private static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**
* 十六進(jìn)制--》二進(jìn)制轉(zhuǎn)化
* @param hexStr
* @return
*/
private static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1) {
return null;
}
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
public static void main(String[] args) throws UnsupportedEncodingException {
long begin=new Date().getTime();
String content = "aaades加密測試";
String password = "12345678dd";
// 加密
System.out.println("加密前:" + content);
byte[] encryptResult = encrypt(content, password);
String encryptResultStr = parseByte2HexStr(encryptResult);
System.out.println("加密后:" + encryptResultStr);
// 解密
byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
byte[] decryptResult = decrypt(decryptFrom, password);
// 解密內(nèi)容進(jìn)行解碼
String result = new String(decryptResult, UTF8);
System.out.println("解密后:" + result);
long end= new Date().getTime();
System.out.println(end-begin);
}
}
注:SecureRandom是生成安全隨機(jī)數(shù)序列,password.getBytes()是種子,只要種子相同,序列就一樣,所以解密只要有password就行,可以復(fù)原這個序列。
PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:
密碼安全性在線檢測:
http://tools.jb51.net/password/my_password_safe
高強(qiáng)度密碼生成器:
http://tools.jb51.net/password/CreateStrongPassword
迅雷、快車、旋風(fēng)URL加密/解密工具:
http://tools.jb51.net/password/urlrethunder
在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
- Java AES256加密解密示例代碼
- java使用RSA與AES加密解密的實(shí)例代碼詳解
- Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法
- Java使用AES加密和解密的實(shí)例詳解
- Java AES加密解密的簡單實(shí)現(xiàn)方法
- Java與Node.js利用AES加密解密出相同結(jié)果的方法示例
- Java實(shí)現(xiàn)的AES256加密解密功能示例
- java使用Hex編碼解碼實(shí)現(xiàn)Aes加密解密功能示例
- Android、iOS和Java通用的AES128加密解密示例代碼
- JAVA中AES對稱加密和解密過程
- Java AES加密和解密教程
相關(guān)文章
解決JAVA項(xiàng)目啟動卡住,無任何異常信息的問題
這篇文章主要介紹了解決JAVA項(xiàng)目啟動卡住,無任何異常信息的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
用攔截器修改返回response,對特定的返回進(jìn)行修改操作
這篇文章主要介紹了用攔截器修改返回response,對特定的返回進(jìn)行修改操作。具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Spring Boot企業(yè)常用的starter示例詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot企業(yè)常用starter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
深入解析StringBuffer和StringBuilder的區(qū)別
以下是對java中StringBuffer與StringBuilder的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07
JavaWeb實(shí)現(xiàn)顯示mysql數(shù)據(jù)庫數(shù)據(jù)
MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在WEB應(yīng)用方面MySQL是最好的。本文將利用JavaWeb實(shí)現(xiàn)顯示mysql數(shù)據(jù)庫數(shù)據(jù)功能,需要的可以參考一下2022-03-03

