Java原生方法實現(xiàn) AES 算法示例
本文實例講述了Java原生方法實現(xiàn) AES 算法。分享給大家供大家參考,具體如下:
AES(Advanced Encryption Standard)高級加密標(biāo)準(zhǔn),在密碼學(xué)中又稱 Rijndael 加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn) 。 這個標(biāo)準(zhǔn)用來替代原先的 DES ,已經(jīng)被多方分析且廣為全世界所使用 。 現(xiàn)已成為對稱密鑰加密中最流行的算法之一 。
/**
* AES 算法
* <p/>
* 算法采用加密模式:CBC;數(shù)據(jù)塊:128;填充:PKCS5Padding
* <p/>
* key 與向量字符串的長度為 16 位
*
* @author Deniro Li (lisq037@163.com)
* 2018/3/17
*/
public class AES {
/**
* 算法名稱
*/
public static final String NAME = "AES";
/**
* 加密模式:CBC;數(shù)據(jù)塊:128;填充:PKCS5Padding
*/
public final String MODE = "AES/CBC/PKCS5Padding";
/**
* KEY 與 向量字符串的長度
*/
public static final int LENGTH = 16;
/**
* 加密用的 KEY
*/
private String key;
/**
* 向量,用于增加加密強(qiáng)度
*/
private String ivParameter;
/**
* @param key 加密用的 KEY
* @param ivParameter 偏移量
*/
public AES(String key, String ivParameter) {
if (key == null || key.length() != LENGTH) {
throw new AESException("KEY 不存在,或者長度不為 " + LENGTH);
}
if (ivParameter == null || ivParameter.length() != LENGTH) {
throw new AESException("ivParameter 不存在,或者長度不為 " + LENGTH);
}
this.key = key;
this.ivParameter = ivParameter;
}
/**
* 加密
*
* @param s 要加密的字符串
* @return 加密后的字符串
*/
public String encode(String s) {
String result;
try {
Cipher cipher = Cipher.getInstance(MODE);
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
cipher.init(ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), NAME), iv);
byte[] bytes = cipher.doFinal(s.getBytes(ENCODING));
result = new BASE64Encoder().encode(bytes);
} catch (Exception e) {
throw new AESException("加密", e);
}
return result;
}
/**
* 解密
*
* @param s 待解密的字符串
* @return 解密后的字符串
*/
public String decode(String s) {
try {
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("ASCII"), NAME);
Cipher cipher = Cipher.getInstance(MODE);
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
return new String(cipher.doFinal(new BASE64Decoder().decodeBuffer(s)), ENCODING);
} catch (Exception e) {
throw new AESException("解密", e);
}
}
}
單元測試:
public class AESTest {
AES aes;
@Before
public void init(){
aes=new AES("12345abcdef67890","1234567890abcdef");
}
@Test
public void testEncode() throws Exception {
Assert.assertEquals("jANei3LBvnLCaZ2XddWHZw==", aes.encode("123456"));
}
@Test
public void testDecode() throws Exception {
Assert.assertEquals("123456", aes.decode("jANei3LBvnLCaZ2XddWHZw=="));
}
}
PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:
文字在線加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode
MD5在線加密工具:
http://tools.jb51.net/password/CreateMD5Password
在線散列/哈希算法加密工具:
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
更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
Java單線程程序?qū)崿F(xiàn)實現(xiàn)簡單聊天功能
這篇文章主要介紹了Java單線程程序?qū)崿F(xiàn)實現(xiàn)簡單聊天功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
Spring boot集成redis lettuce代碼實例
這篇文章主要介紹了Spring boot集成redis lettuce代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
java中List數(shù)組用逗號分隔開轉(zhuǎn)成字符串2種方法
在我們?nèi)粘i_發(fā)中,在前后端交互的時候會遇到多個id或其他字段存放到一個字段中,這時我們會遇到一個List(集合)---->String(單個字段),這篇文章主要給大家介紹了關(guān)于java中List數(shù)組用逗號分隔開轉(zhuǎn)成字符串的2種方法,需要的朋友可以參考下2023-10-10
Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理
這篇文章主要介紹了Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
MyBatis-Plus自動填充功能失效導(dǎo)致的原因及解決
這篇文章主要介紹了MyBatis-Plus自動填充功能失效導(dǎo)致的原因及解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
SpringBoot+SpringBatch+Quartz整合定時批量任務(wù)方式
這篇文章主要介紹了SpringBoot+SpringBatch+Quartz整合定時批量任務(wù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

