對(duì)稱加密/解密

import java.security.Key;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.spec.IvParameterSpec;

import org.apache.commons.lang.StringUtils;

import sun.misc.BASE64Encoder;

import sun.misc.BASE64Decoder;

/**

* MD5加密

* @author Administrator

*

*/

public class MD5Tool {

//向量(同時(shí)擁有向量和密匙才能解密),此向量必須是8byte,多少都報(bào)錯(cuò)

? ? private final byte[] DESIV = new byte[] { 0x22, 0x54, 0x36, 110, 0x40, (byte) 0xac, (byte) 0xad, (byte) 0xdf };// 向量? ?

? ? private AlgorithmParameterSpec iv = null;// 加密算法的參數(shù)接口

? ? private Key key = null;

? ? private String charset = "utf-8";


? ? public static void main(String[] args) {

? ? ? ? try {

? ? ? ? ? ? String value = "abcdefgh";

? ? ? ? ? ? String key = "121323324qwerty";// 自定義密鑰,個(gè)數(shù)不能太短硕蛹,太短報(bào)錯(cuò)吼蚁,過長(zhǎng)漩蟆,它默認(rèn)只取前N位(N的具體值罚斗,大家另行查找資料)

? ? ? ? ? ? MD5Tool mt= new MD5Tool(key, "utf-8");

? ? ? ? ? ? System.out.println("加密前的字符:" + value);

? ? ? ? ? ? System.out.println("加密后的字符:" + mt.encode(value));

? ? ? ? ? ? System.out.println("解密后的字符:" + mt.decode(mt.encode(value)));

? ? ? ? ? ? System.out.println("字符串的MD5值:"+getMD5Value(value));

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }


? ? /**

? ? * 構(gòu)造函數(shù)

? ? * @param deSkey

? ? * @param charset

? ? * @throws Exception

? ? */

? ? public MD5Tool(String deSkey, String charset) throws Exception {

? ? ? ? if (StringUtils.isNotBlank(charset)) {

? ? ? ? ? ? this.charset = charset;

? ? ? ? }

? ? ? ? DESKeySpec keySpec = new DESKeySpec(deSkey.getBytes(this.charset));// 設(shè)置密鑰參數(shù)

? ? ? ? iv = new IvParameterSpec(DESIV);// 設(shè)置向量

? ? ? ? SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 獲得密鑰工廠

? ? ? ? key = keyFactory.generateSecret(keySpec);// 得到密鑰對(duì)象

? ? }


? ? /**

? ? * 加密

? ? * @param data

? ? * @return

? ? * @throws Exception

? ? */

? ? public String encode(String data) throws Exception {

? ? ? ? Cipher enCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");// 得到加密對(duì)象Cipher

? ? ? ? enCipher.init(Cipher.ENCRYPT_MODE, key, iv);// 設(shè)置工作模式為加密模式跺株,給出密鑰和向量

? ? ? ? byte[] pasByte = enCipher.doFinal(data.getBytes(this.charset));

? ? ? ? BASE64Encoder base64Encoder = new BASE64Encoder();

? ? ? ? return base64Encoder.encode(pasByte);

? ? }


? ? /**

? ? * 解密

? ? * @param data

? ? * @return

? ? * @throws Exception

? ? */

? ? public String decode(String data) throws Exception {

? ? ? ? Cipher deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

? ? ? ? deCipher.init(Cipher.DECRYPT_MODE, key, iv);

? ? ? ? BASE64Decoder base64Decoder = new BASE64Decoder();

? ? ? ? //此處注意doFinal()的參數(shù)的位數(shù)必須是8的倍數(shù)郑什,否則會(huì)報(bào)錯(cuò)(通過encode加密的字符串讀出來都是8的倍數(shù)位府喳,但寫入文件再讀出來,就可能因?yàn)樽x取的方式的問題蘑拯,導(dǎo)致最后此處的doFinal()的參數(shù)的位數(shù)不是8的倍數(shù))

? ? ? ? //此處必須用base64Decoder钝满,若用data兜粘。getBytes()則獲取的字符串的byte數(shù)組的個(gè)數(shù)極可能不是8的倍數(shù),而且不與上面的BASE64Encoder對(duì)應(yīng)(即使解密不報(bào)錯(cuò)也不會(huì)得到正確結(jié)果)

? ? ? ? byte[] pasByte = deCipher.doFinal(base64Decoder.decodeBuffer(data));

? ? ? ? return new String(pasByte, this.charset);

? ? }


? ? /**

? ? * 獲取MD5的值弯蚜,可用于對(duì)比校驗(yàn)

? ? * @param sourceStr

? ? * @return

? ? */

? ? private static String getMD5Value(String sourceStr) {

? ? ? ? String result = "";

? ? ? ? try {

? ? ? ? ? ? MessageDigest md = MessageDigest.getInstance("MD5");

? ? ? ? ? ? md.update(sourceStr.getBytes());

? ? ? ? ? ? byte b[] = md.digest();

? ? ? ? ? ? int i;

? ? ? ? ? ? StringBuffer buf = new StringBuffer("");

? ? ? ? ? ? for (int offset = 0; offset < b.length; offset++) {

? ? ? ? ? ? ? ? i = b[offset];

? ? ? ? ? ? ? ? if (i < 0)

? ? ? ? ? ? ? ? ? ? i += 256;

? ? ? ? ? ? ? ? if (i < 16)

? ? ? ? ? ? ? ? ? ? buf.append("0");

? ? ? ? ? ? ? ? buf.append(Integer.toHexString(i));

? ? ? ? ? ? }

? ? ? ? ? ? result = buf.toString();

? ? ? ? } catch (NoSuchAlgorithmException e) {

? ? ? ? }

? ? ? ? return result;

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溅潜,一起剝皮案震驚了整個(gè)濱河市雕崩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖蚂斤,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件一膨,死亡現(xiàn)場(chǎng)離奇詭異缴啡,居然都是意外死亡妒蛇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門帽氓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣斤,“玉大人,你說我怎么就攤上這事黎休∨欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵势腮,是天一觀的道長(zhǎng)联贩。 經(jīng)常有香客問我,道長(zhǎng)捎拯,這世上最難降的妖魔是什么泪幌? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮署照,結(jié)果婚禮上祸泪,老公的妹妹穿的比我還像新娘。我一直安慰自己建芙,他們只是感情好没隘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著禁荸,像睡著了一般右蒲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赶熟,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天瑰妄,我揣著相機(jī)與錄音,去河邊找鬼映砖。 笑死间坐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眶诈,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涨醋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瓜饥!你這毒婦竟也來了逝撬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤乓土,失蹤者是張志新(化名)和其女友劉穎宪潮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趣苏,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狡相,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了食磕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尽棕。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖彬伦,靈堂內(nèi)的尸體忽然破棺而出滔悉,到底是詐尸還是另有隱情,我是刑警寧澤单绑,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布回官,位于F島的核電站,受9級(jí)特大地震影響搂橙,放射性物質(zhì)發(fā)生泄漏歉提。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一区转、第九天 我趴在偏房一處隱蔽的房頂上張望苔巨。 院中可真熱鬧,春花似錦废离、人聲如沸侄泽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔬顾。三九已至,卻和暖如春湘捎,著一層夾襖步出監(jiān)牢的瞬間诀豁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工窥妇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舷胜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像烹骨,于是被迫代替她去往敵國(guó)和親翻伺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容