package com.csh.encryptdemo.encryptutils;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
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;
/**
* Created by 宮智耀 on 2016/10/13.
*/
public class AES {
/**
* AES 加密
*
* @param seed 密鑰
* @param cleartext 明文
* @return 密文
*/
public static String encrypt(String seed, String cleartext) {
//對(duì)密鑰進(jìn)行加密
byte[] rawkey = getRawKey(seed.getBytes());
//加密數(shù)據(jù)
byte[] result = encrypt(rawkey, cleartext.getBytes());
//將十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)
return toHex(result);
}
/**
* AES 解密
*
* @param seed 密鑰
* @param encrypted 密文
* @return 明文
*/
public static String decrypt(String seed, String encrypted) {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
private static byte[] getRawKey(byte[] seed) {
try {
//獲取密鑰生成器
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr =null;
// 在4.2以上版本中司致,SecureRandom獲取方式發(fā)生了改變
if (android.os.Build.VERSION.SDK_INT >= 17) {
sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
} else {
sr = SecureRandom.getInstance("SHA1PRNG");
}
sr.setSeed(seed);
//生成位的AES密碼生成器
kgen.init(128, sr);
//生成密鑰
SecretKey skey = kgen.generateKey();
//編碼格式
byte[] raw = skey.getEncoded();
return raw;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
return null;
}
private static byte[] encrypt(byte[] raw, byte[] clear) {
try {
//生成一系列擴(kuò)展密鑰挫鸽,并放入一個(gè)數(shù)組中
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
//使用ENCRYPT_MODE模式企量,用skeySpec密碼組裁着,生成AES加密方法
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
//得到加密數(shù)據(jù)
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return null;
}
private static byte[] decrypt(byte[] raw, byte[] encrypted) {
try {
//生成一系列擴(kuò)展密鑰挽放,并放入一個(gè)數(shù)組中
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = null;
cipher = Cipher.getInstance("AES");
//使用DECRYPT_MODE模式晒屎,用skeySpec密碼組,生成AES解密方法
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
//得到加密數(shù)據(jù)
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
} 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();
}
return null;
}
//將十進(jìn)制數(shù)轉(zhuǎn)為十六進(jìn)制
public static String toHex(String txt) {
return toHex(txt.getBytes());
}
//將十六進(jìn)制字符串轉(zhuǎn)換位十進(jìn)制字符串
public static String fromHex(String hex) {
return new String(toByte(hex));
}
//將十六進(jìn)制字符串轉(zhuǎn)為十進(jìn)制字節(jié)數(shù)組
public static byte[] toByte(String hexString) {
int len = hexString.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++) {
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue();
}
return result;
}
//將十進(jìn)制字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制
public static String toHex(byte[]buf){
if(buf==null){
return "";
}
StringBuffer result=new StringBuffer(2*buf.length);
for(int i=0;i<buf.length;i++){
appendHex(result,buf[i]);
}
return result.toString();
}
private final static String HEX="0123456789ABCDEF";
private static void appendHex(StringBuffer sb,byte b){
sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
}
}
AES工具類(lèi)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén)煤痕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梧宫,“玉大人,你說(shuō)我怎么就攤上這事摆碉√料唬” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵巷帝,是天一觀(guān)的道長(zhǎng)忌卤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)楞泼,這世上最難降的妖魔是什么驰徊? 我笑而不...
- 正文 為了忘掉前任笤闯,我火速辦了婚禮,結(jié)果婚禮上棍厂,老公的妹妹穿的比我還像新娘颗味。我一直安慰自己,他們只是感情好牺弹,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布浦马。 她就那樣靜靜地躺著,像睡著了一般张漂。 火紅的嫁衣襯著肌膚如雪晶默。 梳的紋絲不亂的頭發(fā)上,一...
- 那天航攒,我揣著相機(jī)與錄音磺陡,去河邊找鬼。 笑死漠畜,一個(gè)胖子當(dāng)著我的面吹牛仅政,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盆驹,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼圆丹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了躯喇?” 一聲冷哼從身側(cè)響起辫封,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廉丽,沒(méi)想到半個(gè)月后倦微,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡正压,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年欣福,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焦履。...
- 正文 年R本政府宣布屑宠,位于F島的核電站厢洞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躺翻,卻給世界環(huán)境...
- 文/蒙蒙 一丧叽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧公你,春花似錦蠢正、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至懦傍,卻和暖如春雹舀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粗俱。 一陣腳步聲響...
- 正文 我出身青樓签财,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親偏塞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唱蒸,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- package com.thinkgem.jeesite.modules.emindsoft.util; impo...
- 加密工具類(lèi)神汹,提供RSA & AES & DES 等加密解密方法 github項(xiàng)目地址https://github....
- github項(xiàng)目地址 https://github.com/XHTeng/XHCryptorTools 工具類(lèi)介...
- 很早就聽(tīng)過(guò)“女孩要富養(yǎng)捉腥,男孩要窮養(yǎng)”這句話(huà)氓拼。 意思是女孩從小就要富養(yǎng),作為父母的應(yīng)該在自己能力范圍內(nèi)給她們最好的物...