java基于AES對稱加密算法實現(xiàn)的加密與解密功能示例
本文實例講述了java基于AES對稱加密算法實現(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對象實際完成加密操作 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對象實際完成加密操作 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是生成安全隨機數(shù)序列,password.getBytes()是種子,只要種子相同,序列就一樣,所以解密只要有password就行,可以復(fù)原這個序列。
PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:
密碼安全性在線檢測:
http://tools.jb51.net/password/my_password_safe
高強度密碼生成器:
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è)計有所幫助。
相關(guān)文章
SpringBoot集成支付寶沙箱支付的實現(xiàn)示例
本文主要介紹了SpringBoot集成支付寶沙箱支付的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12java JTree JCheckBox樹復(fù)選框詳解
這篇文章主要為大家詳細(xì)介紹了java JTree JCheckBox樹復(fù)選框的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11springboot中json對象中對Long類型和String類型相互轉(zhuǎn)換
與前端聯(lián)調(diào)接口時,后端一些字段設(shè)計為Long類型,這樣就有可能導(dǎo)致前端缺失精度,這時候我們就需要將Long類型返回給前端時做數(shù)據(jù)類型轉(zhuǎn)換,本文主要介紹了springboot中json對象中對Long類型和String類型相互轉(zhuǎn)換,感興趣的可以了解一下2023-11-11基于SpringAOP+Caffeine實現(xiàn)本地緩存的實例代碼
公司想對一些不經(jīng)常變動的數(shù)據(jù)做一些本地緩存,我們使用AOP+Caffeine來實現(xiàn),所以本文給大家介紹了2024-03-03
基于SpringAOP+Caffeine實現(xiàn)本地緩存的實例,文中有詳細(xì)的代碼供大家參考,需要的朋友可以參考下