版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、JAVA實現(xiàn)AES加密算法代碼JAVA實現(xiàn)AES加密算法代碼近些年DES使用越來越少,原因就在于其使用56位密鑰,比較容易被破解,近些年來逐漸被AES替代,AES已經(jīng)變成目前對稱加密中最流行算法之一;AES可以使用128、192、和256位密鑰,并且用128位分組加密和解密數(shù)據(jù)。本文就簡單介紹如何通過JAVA實現(xiàn)AES加密。LJAVA實現(xiàn)閑話少許,掠過AES加密原理及算法,關(guān)于這些直接搜索專業(yè)網(wǎng)站吧,我們直接看JAVA的具體實現(xiàn)。1.1加密代碼有詳細(xì)解釋,不多廢話。/* 加密*paramcontent需要加密的內(nèi)容*param password 加密密碼* ©return */pub
2、licstaticbyteencrypt(Stringcontent,Stringpassword)tryKeyGeneratorkgen=KeyGeneratongetInstance(uAESn);kgen>init(l28,newSecureRandom(password>getBytes();SecretKeysecretKey=kgen.generateKey();byteenCodeFormat=secretKey>getEncoded();SecretKeySpeckey=newSecretKeySpec(enCodeFormat,f,AESft);Cipher
3、cipherbyte口=Ciphengetlnstance(11AES11);/創(chuàng)建密碼器byteContent=contentegetBytes(11utf-8H);cipheninit(Cipher.ENCRYPT_MODE,key);/初始化byte|Jresult=cipheEdoFinal(byteContent);returnresult;/力口密catch(NoSuchAlgorithmExceptione)CeprintStackTraceO;catch(NoSuchPaddingExceptione)e>printStackTrace();catch(InvalidKe
4、yExceptione)e.printStackTrace();catch(UnsupportedEncodingExceptione)e>printStackTraceO;catch(IllegalBlockSizeExccptione)e>printStackTrace();catch(BadPaddingExceptione)e>printStackTrace();returnnull;/*加密*paramcontent需要加密的內(nèi)publicstaticbyte|Jencrypt(Stringcontent,Stringpassword)* param passwor
5、d 加密密碼* return */tryKeyGeneratorkgen=KeyGenerator.getInstance(nAESn);kgen.init(128,newSecureRandom(password.getBytes();SecretKeysecretKey=kgen>generateKey();byte|enCodeFormat=secretKey<getEncoded();SecretKeySpeckey=newSecretKeySpec(enCodeFormat,nAESn);Ciphercipher=Cipher.getrnstance(uAESn);/創(chuàng)建
6、密碼器byte|byteContent=content.getBytes(nutf-8n);cipher.init(Cipher.ENCRYPT_MODE,key);/初始化byte|result=cipheEdoFinal(byteContent);returnresult;/力口密catch(NoSuchAlgorithmExceptione)e>printStackTrace();catch(NoSuchPaddingExceptione)e>printStackTrace();catch(InvalidKeyExceptione)e.printStackTrace();ca
7、tch(UnsupportedEncodingExceptione)eeprintStackTraceO;catch(IllegalBlockSizeExceptione)e>printStackTrace();catch(BadPaddingExceptione)e>printStackTrace();returnnull;2.2解密代碼有詳細(xì)注釋,不多廢話注意:解密的時候要傳入byte數(shù)組viewplaincopytoclipboardprint?/*解密*paramcontent待解密內(nèi)容*parampassword解密密鑰*return*/publicstaticbyte|
8、decrypt(bytecontent,Stringpassword)tryKeyGeneratorkgen=KeyGeneratongetInstance(nAESn);kgen>init(128,newSecureRandom(password>getBytes();SecretKeysecretKey=kgen>generateKey();byte|enCodeFormat=secretKey<getEncoded();SecretKeySpeckey=newSecretKeySpec(enCodeFormat,f,AESH);Ciphercipher=Ciphe
9、ngetlnstance(nAESu);/創(chuàng)建密碼器cipheranit(Cipher.DECRYPT_MODE,key);/初始化byteresult=cipher.doFinal(content);returnresult;/力口密catch(NoSuchAIgorithmExceptione)eeprintStackTrace();catch(NoSuchPaddingExceptione)eeprintStackTrace();catch(InvalidKeyExceptione)eeprintStackTrace();catch(IllegalBlockSizeExceptione)
10、e.printStackTi*ace();catch(BadPaddingExceptione)e.printStackTrace();returnnull;/*解密*paramcontent待解密內(nèi)容*parampassword解密密鑰*©return*/publicstaticbytedecrypt(bytecontent,Stringpassword)tryKeyGeneratorkgen=KeyGeneratongetlnstance(11AESn);kgen.init(l28,newSecureRandom(password>getBytes();SecretKeys
11、ecretKey=kgen.generateKey();byteenCodeFormat=secretKey>getEncoded();SecretKeySpeckey=newSecretKeySpec(enCodeFormat,f,AESn);Ciphercipher=Cipher.getlnstance(nAES11);/創(chuàng)建密工二cipheninit(Cipher.DECRYPT_MODE,key);/初始化byteresult=cipher.doFinal(content);returnresult;/加密catch(NoSuchAIgorithmExceptione)eepri
12、ntStackTrace();catch(NoSuchPaddingExceptione)eeprintStackTrace();catch(InvalidKeyExceptione)eeprintStackTrace();catch(IllegalBlockSizeExceptione)eeprintStackTrace();catch(BadPaddingExceptione)eeprintStackTrace();returnnull;2.3測試代碼Stringcontent=Mtestn;Stringpassword="12345678”;加密System.out.print
13、ln("力口密前:n+content);byteencryptResult=encrypt(content,password);解密bytedecryptResult=decrypt(encryptResult,password);System.out.println("解密后:n+newString(decryptResult);Stringcontent=''test"Stringpassword="12345678''加密System.out.printing'力口密前:"+content);byt
14、eencryptResult=encrypt(content,password);解密bytedecryptResult=decrypt(encryptResult,password);System>out>println(u解密后:”+newString(decryptResult);輸出結(jié)果如下:加密前:test解密后:test2.4容易出錯的地方但是如果我們將測試代碼修改一下,如下:String content="test";Stringpassword="12345678"加密System.out.println("力口密前
15、:"+content);bytetryencryptResult=encrypt(content,password);StringencryptResultStr=newString(encryptResult,futf-8f,);解密bytedecryptResult=decrypt(encryptResultStngetBytes(nutf-8''),password);System.out.println("解密后:n+newString(decryptResult);catch(UnsupportedEncodingExceptione)e.prin
16、tStackTrace();Stringcontent=HtestH;Stringpassword="12345678”;加密System.out.printing力口密前:n+content);byteencryptResult=encrypt(content,password);tryStringencryptResultStr=newString(encryptResult,11utf-8,1;解密bytedecryptResult=decrypt(encryptResultStngetBytes(nutf-8''),password);System.out.p
17、rintln("解密后:''+newString(decryptResult);catch(UnsupportedEncodingExceptione)e.printStackTrace();)貝!系統(tǒng)會報出如下異常:javaXeCryptoJllegalBlockSizeException:Inputlengthmustbemultipleof16whendecryptingwithpaddedcipheratcom>sunecrypto>providenSunJCE_feb(DashoA13*.)atcom.sunecryptOeprovidenSun
18、JCE_feb(DashoA13*e.)atcomeSun>crypto>providenAESCipher.engineDoFinal(DashoA13*.)atjavax.crypto.Cipher.doFinal(DashoA13*.)這主要是因為加密后的byte數(shù)組是不能強(qiáng)制轉(zhuǎn)換成字符串的,換言之:字符串和byte數(shù)組在這種情況下不是互逆的;要避免這種情況,我們需要做一些修訂,可以考慮將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制表示,主要有如下兩個方法:2.4.1將二進(jìn)制轉(zhuǎn)換成16進(jìn)制/*將二進(jìn)制轉(zhuǎn)換成16進(jìn)制*parambuf*©return*/publicstaticStrin
19、gparseByte2HexStr(bytebuf)StringBuffersb=newStringBuffer();for(inti=0;iStringhex=Integer.toHexString(bufi&OxFF);if(hex.length()=1)hex='O'+hex;sb.append(hex.toUpperCase();returnsb.toString();/*將二進(jìn)制轉(zhuǎn)換成16進(jìn)制*parambuf*©return*/publicstaticStringparseByte2HexStr(bytebuf)StringBuffersb=new
20、StringBuffer();for(inti=0;iStringhex=Integer.toHexString(bufi&OxFF);if(hex.length()=1)hex='O'+hex;sb.append(hex.toUpperCase();returnsb.toString();2.4.2將16進(jìn)制轉(zhuǎn)換為二進(jìn)制/*將16進(jìn)制轉(zhuǎn)換為二進(jìn)制*paramhexStr*©return*/publicstaticbyteparseHexStr2Byte(StringhexStr)if(hexStr.length()returnnull;byteresult=
21、newbytehexStr.length()/2;for(inti=0;iinthigh=Integer.parseInt(hexStr.substring(i*2,i*2+l),16);intlow=Integer.parseInt(hexStr.substring(i*2+l,i*2+2),16);resulti=(byte)(high*16+low);returnresult;/*將16進(jìn)制轉(zhuǎn)換為二進(jìn)制*paramhexStr*return*/publicstaticbyteparseHexStr2Byte(StringhexStr)if(hexStr.length()returnnul
22、l;byteresult=newbytehexStr.length()/2;for(inti=0;iinthigh=Integer.parseInt(hexStr.substring(i*2,i*2+l),16);intlow=IntegenparseInt(hexStnsubstring(i*2+l,i*2+2),16);returnresulti=(byte)(high*16+low);result;然后,我們再修訂以上測試代碼,如下:Stringcontent="test"Stringpassword="12345678”;加密System.out.prin
23、tln("加密前:''+content);byteencryptResult=encrypt(content,password);StringencryptResultStr=parseByte2HexStr(encryptResult);System.out.printing力口密后:"+encryptResultStr);解密bytedecryptFrom=parseHexStr2Byte(encryptResultStr);bytedecryptResult=decrypt(decryptFrom,password);System.out.printl
24、n("解密后:H+newString(decryptResult);Stringcontent="test"Stringpassword=''12345678''加密System.out.printing'力口密前:"+content);byteencryptResult=encrypt(content,password);StringencryptResultStr=parseByte2HexStr(encryptResult);System.out.println("力口密后:"+encry
25、ptResultStr);解密bytedecryptFrom=parseHexStr2Byte(encryptResultStr);bytedecryptResult=decrypt(decryptFrom,password);System.out.printin("解密后:"+newString(decryptResult);測試結(jié)果如下:加密前:test加密后:73C58BAFE578C59366D8C995CD0B9D6D解密后:test2.5另外一種加密方式還有一種加密方式,大家可以參考如下:/*加密*paramcontent需要加密的內(nèi)容param passwor
26、d 加密密碼return*/publicstaticbyteencrypt2(Stringcontent,Stringpassword)trySecretKeySpeckey=newSecretKeySpec(passwordegetBytes(),nAESn);Ciphercipher=Cipher.getInstance(HAES/ECB/NoPaddingn);bytebyteContent=content.getBytes(11utf-8M);cipher.init(Cipher.ENCRYPT_MODE,key);/初始化byteresult=cipher.doFinal(byteC
27、ontent);returnresult;/力口密catch(NoSuchAlgorithmExceptione)eeprintStackTrace();catch(NoSuchPaddingExceptione)eeprintStackTrace();catch(InvalidKeyExceptione)eeprintStackTrace();catch(UnsupportedEncodingExceptione)eeprintStackTrace();catch(IllegalBlockSizeExceptione)e>printStackTrace();catch(BadPaddingExceptione)eeprintStackTrace();returnnull;/*加密*paramcontent需要加密的內(nèi)param password 加密密碼* ©return */publicstaticbyteencrypt2(Stringcontent,Stringpassword)trySecretKeySpeckey=newSecretKeySpec(passwordegetBytes(),nAESf,);Ciphercipher=Cipher.g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年消防設(shè)施檢測與維保服務(wù)合同5篇
- 2025年度安置房質(zhì)量保證合同書3篇
- 2025年水泥制品環(huán)保技術(shù)轉(zhuǎn)移合同3篇
- 2025年度高空墜落防護(hù)HSE施工安全協(xié)議3篇
- 二零二五年房產(chǎn)銷售代理與廣告宣傳協(xié)議3篇
- 二零二五年鮮活水產(chǎn)品運輸與質(zhì)量監(jiān)管協(xié)議3篇
- 2025年度免租金停車場租賃合同模板
- 2025版棋牌室三方合作協(xié)議-創(chuàng)新管理與行業(yè)規(guī)范4篇
- 2025年污水處理站污水處理設(shè)施設(shè)備租賃與維修合同3篇
- 2025年度留學(xué)簽證擔(dān)保與資金證明服務(wù)合同3篇
- 公司組織架構(gòu)圖(可編輯模版)
- 1汽輪機(jī)跳閘事故演練
- 陜西省銅川市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)
- 禮品(禮金)上交登記臺賬
- 普通高中英語課程標(biāo)準(zhǔn)詞匯表
- 北師大版七年級數(shù)學(xué)上冊教案(全冊完整版)教學(xué)設(shè)計含教學(xué)反思
- 2023高中物理步步高大一輪 第五章 第1講 萬有引力定律及應(yīng)用
- 青少年軟件編程(Scratch)練習(xí)題及答案
- 浙江省公務(wù)員考試面試真題答案及解析精選
- 系統(tǒng)性紅斑狼瘡-第九版內(nèi)科學(xué)
- 全統(tǒng)定額工程量計算規(guī)則1994
評論
0/150
提交評論