導航:首頁 > 編程語言 > javaaes128

javaaes128

發布時間:2024-04-02 04:22:13

❶ 如何使用java對密碼加密 加密方式aes

Java有相關的實現類:具體原理如下
對於任意長度的明文,AES首先對其進行分組,每組的長度為128位。分組之後將分別對每個128位的明文分組進行加密。
對於每個128位長度的明文分組的加密過程如下:
(1)將128位AES明文分組放入狀態矩陣中。
(2)AddRoundKey變換:對狀態矩陣進行AddRoundKey變換,與膨脹後的密鑰進行異或操作(密鑰膨脹將在實驗原理七中詳細討論)。
(3)10輪循環:AES對狀態矩陣進行了10輪類似的子加密過程。前9輪子加密過程中,每一輪子加密過程包括4種不同的變換,而最後一輪只有3種變換,前9輪的子加密步驟如下:
● SubBytes變換:SubBytes變換是一個對狀態矩陣非線性的變換;
● ShiftRows變換:ShiftRows變換對狀態矩陣的行進行循環移位;
● MixColumns變換:MixColumns變換對狀態矩陣的列進行變換;
● AddRoundKey變換:AddRoundKey變換對狀態矩陣和膨脹後的密鑰進行異或操作。
最後一輪的子加密步驟如下:
● SubBytes變換:SubBytes變換是一個對狀態矩陣非線性的變換;
● ShiftRows變換:ShiftRows變換對狀態矩陣的行進行循環移位;
● AddRoundKey變換:AddRoundKey變換對狀態矩陣和膨脹後的密鑰進行異或操作;
(4)經過10輪循環的狀態矩陣中的內容就是加密後的密文。
AES的加密演算法的偽代碼如下。

在AES演算法中,AddRoundKey變換需要使用膨脹後的密鑰,原始的128位密鑰經過膨脹會產生44個字(每個字為32位)的膨脹後的密鑰,這44個字的膨脹後的密鑰供11次AddRoundKey變換使用,一次AddRoundKey使用4個字(128位)的膨脹後的密鑰。
三.AES的分組過程
對於任意長度的明文,AES首先對其進行分組,分組的方法與DES相同,即對長度不足的明文分組後面補充0即可,只是每一組的長度為128位。
AES的密鑰長度有128比特,192比特和256比特三種標准,其他長度的密鑰並沒有列入到AES聯邦標准中,在下面的介紹中,我們將以128位密鑰為例。
四.狀態矩陣
狀態矩陣是一個4行、4列的位元組矩陣,所謂位元組矩陣就是指矩陣中的每個元素都是一個1位元組長度的數據。我們將狀態矩陣記為State,State中的元素記為Sij,表示狀態矩陣中第i行第j列的元素。128比特的明文分組按位元組分成16塊,第一塊記為「塊0」,第二塊記為「塊1」,依此類推,最後一塊記為「塊15」,然後將這16塊明文數據放入到狀態矩陣中,將這16塊明文數據放入到狀態矩陣中的方法如圖2-2-1所示。

塊0

塊4

塊8

塊12

塊1

塊5

塊9

塊13

塊2

塊6

塊10

塊14

塊3

塊7

塊11

塊15

圖2-2-1 將明文塊放入狀態矩陣中
五.AddRoundKey變換
狀態矩陣生成以後,首先要進行AddRoundKey變換,AddRoundKey變換將狀態矩陣與膨脹後的密鑰進行按位異或運算,如下所示。

其中,c表示列數,數組W為膨脹後的密鑰,round為加密輪數,Nb為狀態矩陣的列數。
它的過程如圖2-2-2所示。

圖2-2-2 AES演算法AddRoundKey變換
六.10輪循環
經過AddRoundKey的狀態矩陣要繼續進行10輪類似的子加密過程。前9輪子加密過程中,每一輪要經過4種不同的變換,即SubBytes變換、ShiftRows變換、MixColumns變換和AddRoundKey變換,而最後一輪只有3種變換,即SubBytes變換、ShiftRows變換和AddRoundKey變換。AddRoundKey變換已經討論過,下面分別討論餘下的三種變換。
1.SubBytes變換
SubBytes是一個獨立作用於狀態位元組的非線性變換,它由以下兩個步驟組成:
(1)在GF(28)域,求乘法的逆運算,即對於α∈GF(28)求β∈GF(28),使αβ =βα = 1mod(x8 + x4 + x3 + x + 1)。
(2)在GF(28)域做變換,變換使用矩陣乘法,如下所示:

由於所有的運算都在GF(28)域上進行,所以最後的結果都在GF(28)上。若g∈GF(28)是GF(28)的本原元素,則對於α∈GF(28),α≠0,則存在
β ∈ GF(28),使得:
β = gαmod(x8 + x4 + x3 + x + 1)
由於g255 = 1mod(x8 + x4 + x3 + x + 1)
所以g255-α = β-1mod(x8 + x4 + x3 + x + 1)
根據SubBytes變換演算法,可以得出SubBytes的置換表,如表2-2-1所示,這個表也叫做AES的S盒。該表的使用方法如下:狀態矩陣中每個元素都要經過該表替換,每個元素為8比特,前4比特決定了行號,後4比特決定了列號,例如求SubBytes(0C)查表的0行C列得FE。
表2-2-1 AES的SubBytes置換表

它的變換過程如圖2-2-3所示。

圖2-2-3 SubBytes變換
AES加密過程需要用到一些數學基礎,其中包括GF(2)域上的多項式、GF(28)域上的多項式的計算和矩陣乘法運算等,有興趣的同學請參考相關的數學書籍。
2.ShiftRows變換
ShiftRows變換比較簡單,狀態矩陣的第1行不發生改變,第2行循環左移1位元組,第3行循環左移2位元組,第4行循環左移3位元組。ShiftRows變換的過程如圖2-2-4所示。

圖2-2-4 AES的ShiftRows變換
3.MixColumns變換
在MixColumns變換中,狀態矩陣的列看作是域GF(28)的多項式,模(x4+1)乘以c(x)的結果:
c(x)=(03)x3+(01)x2+(01)x+(02)
這里(03)為十六進製表示,依此類推。c(x)與x4+1互質,故存在逆:
d(x)=(0B)x3+(0D)x2+(0G)x+(0E)使c(x)•d(x) = (D1)mod(x4+1)。
設有:

它的過程如圖2-2-5所示。

圖2-2-5 AES演算法MixColumns變換
七.密鑰膨脹
在AES演算法中,AddRoundKey變換需要使用膨脹後的密鑰,膨脹後的密鑰記為子密鑰,原始的128位密鑰經過膨脹會產生44個字(每個字為32位)的子密鑰,這44個字的子密鑰供11次AddRoundKey變換使用,一次AddRoundKey使用4個字(128位)的膨脹後的密鑰。
密鑰膨脹演算法是以字為基礎的(一個字由4個位元組組成,即32比特)。128比特的原始密鑰經過膨脹後將產生44個字的子密鑰,我們將這44個密鑰保存在一個字數組中,記為W[44]。128比特的原始密鑰分成16份,存放在一個位元組的數組:Key[0],Key[1]……Key[15]中。
在密鑰膨脹演算法中,Rcon是一個10個字的數組,在數組中保存著演算法定義的常數,分別為:
Rcon[0] = 0x01000000
Rcon[1] = 0x02000000
Rcon[2] = 0x04000000
Rcon[3] = 0x08000000
Rcon[4] = 0x10000000
Rcon[5] = 0x20000000
Rcon[6] = 0x40000000
Rcon[7] = 0x80000000
Rcon[8] = 0x1b000000
Rcon[9] = 0x36000000
另外,在密鑰膨脹中包括其他兩個操作RotWord和SubWord,下面對這兩個操作做說明:
RotWord( B0,B1,B2,B3 )對4個位元組B0,B1,B2,B3進行循環移位,即
RotWord( B0,B1,B2,B3 ) = ( B1,B2,B3,B0 )
SubWord( B0,B1,B2,B3 )對4個位元組B0,B1,B2,B3使用AES的S盒,即
SubWord( B0,B1,B2,B3 ) = ( B』0,B』1,B』2,B』3 )
其中,B』i = SubBytes(Bi),i = 0,1,2,3。
密鑰膨脹的演算法如下:

八.解密過程
AES的加密和解密過程並不相同,首先密文按128位分組,分組方法和加密時的分組方法相同,然後進行輪變換。
AES的解密過程可以看成是加密過程的逆過程,它也由10輪循環組成,每一輪循環包括四個變換分別為InvShiftRows變換、InvSubBytes變換、InvMixColumns變換和AddRoundKey變換;
這個過程可以描述為如下代碼片段所示:

九.InvShiftRows變換
InvShiftRows變換是ShiftRows變換的逆過程,十分簡單,指定InvShiftRows的變換如下。
Sr,(c+shift(r,Nb))modNb= Sr,c for 0 < r< 4 and 0 ≤ c < Nb
圖2-2-6演示了這個過程。

圖2-2-6 AES演算法InvShiftRows變換
十.InvSubBytes變換
InvSubBytes變換是SubBytes變換的逆變換,利用AES的S盒的逆作位元組置換,表2-2-2為InvSubBytes變換的置換表。
表2-2-2 InvSubBytes置換表

十一.InvMixColumns變換
InvMixColumns變換與MixColumns變換類似,每列乘以d(x)
d(x) = (OB)x3 + (0D)x2 + (0G)x + (0E)
下列等式成立:
( (03)x3 + (01)x2 + (01)x + (02) )⊙d(x) = (01)
上面的內容可以描述為以下的矩陣乘法:

十二.AddRoundKey變換
AES解密過程的AddRoundKey變換與加密過程中的AddRoundKey變換一樣,都是按位與子密鑰做異或操作。解密過程的密鑰膨脹演算法也與加密的密鑰膨脹演算法相同。最後狀態矩陣中的數據就是明文。

❷ AES加密演算法256位密鑰與128位密鑰的不同是什麼

一、指代不同

1、256位密鑰:AES的區塊長度固定為256位,密鑰長度則可以是256。

2、128位密鑰:AES的區塊長度固定為128位,密鑰長度則可以是128。

二、安全性不同

1、256位密鑰:256位密鑰安全性高於128位密鑰。

2、128位密鑰:128位密鑰安全性低於256位密鑰。


(2)javaaes128擴展閱讀

AES和Rijndael加密法並不完全一樣(雖然在實際應用中二者可以互換),因為Rijndael加密法可以支持更大范圍的區塊和密鑰長度。

AES的區塊長度固定為128位,密鑰長度則可以是128,192或256位;而Rijndael使用的密鑰和區塊長度可以是32位的整數倍,以128位為下限,256位為上限。加密過程中使用的密鑰是由Rijndael密鑰生成方案產生。

對稱/分組密碼一般分為流加密(如OFB、CFB等)和塊加密(如ECB、CBC等)。對於流加密,需要將分組密碼轉化為流模式工作。對於塊加密(或稱分組加密),如果要加密超過塊大小的數據,就需要涉及填充和鏈加密模式。

ECB模式是最早採用和最簡單的模式,將加密的數據分成若干組,每組的大小跟加密密鑰長度相同,然後每組都用相同的密鑰進行加密。


❸ AES-128 加密演算法的問題

AES內部始終使用16 byte的分組長度!加密時,如果明文位元組長度不是16的整數倍,要填充到大於該長度的最接近的16的倍數,但是如果剛好等於16的倍數,就額外在添加一個完整的分組,也就是添加16位元組。具體你的例子,得到的是32位元組長度的密文。細節請參考PKCS5/7,這些標準是權威指南!

❹ aes128綆楁硶 瀵嗘枃鍜屾槑鏂囧備綍綆楀嚭瀵嗙爜

AES-128鏄涓縐嶅圭О鍔犲瘑綆楁硶錛屼嬌鐢ㄧ浉鍚岀殑瀵嗛掗榪涜屽姞瀵嗗拰瑙e瘑銆傚瘑閽ラ暱搴︿負128浣嶏紙16瀛楄妭錛夛紝瀵嗛掗鍙浠ユ槸闅忔満鐢熸垚鐨勩
瑕佽$畻鍑哄瘑鐮侊紙鍗沖瘑鏂囧拰鏄庢枃涔嬮棿鐨勮漿鎹錛夛紝闇瑕佷互涓嬫ラわ細
1. 瀵嗛掗鐢熸垚錛氶栧厛錛岄渶瑕佺敓鎴愪竴涓128浣嶇殑瀵嗛掗銆傚瘑閽ュ彲浠ユ槸闅忔満鐢熸垚鐨勶紝涔熷彲浠ヤ嬌鐢ㄥ瘑鐮佸﹀畨鍏ㄧ殑浼闅忔満鏁扮敓鎴愬櫒鐢熸垚銆
2. 鍒嗙粍鍜屽~鍏咃細灝嗘槑鏂囧垎鎴愬滻瀹氶暱搴︾殑鍧楋紙閫氬父涓128浣嶏級銆傚傛灉鏄庢枃鐨勯暱搴︿笉鏄鍧楅暱搴︾殑鏁存暟鍊嶏紝闇瑕佽繘琛屽~鍏咃紝浠ユ弧瓚沖潡闀垮害鐨勮佹眰銆
3. 鍒濆嬭疆瀵嗛掗鍔狅細灝嗙敓鎴愮殑瀵嗛掗涓庣涓涓瀵嗘枃鍧楄繘琛屽紓鎴栨搷浣溿
4. 杞鍑芥暟錛欰ES綆楁硶涓浣跨敤浜嗕竴緋誨垪鐨勮疆鍑芥暟錛屽寘鎷瀛楄妭浠f崲錛圫ubBytes錛夈佽屼綅縐伙紙ShiftRows錛夈佸垪娣鋒穯錛圡ixColumns錛夊拰杞瀵嗛掗鍔狅紙AddRoundKey錛夌瓑鎿嶄綔銆傝繖浜涙搷浣滃湪姣忎竴杞涓閮戒細琚搴旂敤鍒板瘑鏂囧潡涓娿
5. 杞鏁板驚鐜錛氭牴鎹瓵ES綆楁硶鐨勮勫畾錛屾牴鎹瀵嗛掗闀垮害紜瀹氬姞瀵嗚疆鏁般傛瘡涓杞涓閮戒細瀵瑰瘑鏂囧潡榪涜屼竴緋誨垪鐨勮疆鍑芥暟鎿嶄綔銆
6. 鏈鍚庝竴杞錛氬湪鏈鍚庝竴杞涓錛屼笉浼氭墽琛屽垪娣鋒穯錛圡ixColumns錛夋搷浣溿
7. 瀵嗘枃鐢熸垚錛氱粡榪囨墍鏈夎疆鏁扮殑澶勭悊鍚庯紝鏈鍚庡緱鍒扮殑瀵嗘枃鍗充負鍔犲瘑鍚庣殑緇撴灉銆
瑙e瘑榪囩▼涓庡姞瀵嗚繃紼嬬浉浼礆紝鍙鏄鍦ㄨ疆瀵嗛掗鍔狅紙AddRoundKey錛夋ラや腑浣跨敤鐨勬槸閫嗗瘑閽ワ紝浠ラ嗗簭榪涜岃В瀵嗘搷浣溿
闇瑕佹敞鎰忕殑鏄錛屽姞瀵嗗拰瑙e瘑浣跨敤鐩稿悓鐨勫瘑閽ワ紝鍥犳ゅ湪榪涜屾暟鎹浼犺緭鏃訛紝闇瑕佺『淇濆瘑閽ョ殑瀹夊叏鎬э紝浠ュ厤琚鏈鎺堟潈鐨勪漢鑾峰緱瀵嗛掗騫惰В瀵嗘暟鎹銆

❺ java實現ase加密解密

這個演算法java SDK自帶的額 參考代碼如下:

/**解密

*@paramcontent待解密內容

*@parampassword解密密鑰

*@return

*/

publicstaticbyte[]decrypt(byte[]content,Stringpassword){

try{

KeyGeneratorkgen=KeyGenerator.getInstance("AES");

kgen.init(128,newSecureRandom(password.getBytes()));

SecretKeysecretKey=kgen.generateKey();

byte[]enCodeFormat=secretKey.getEncoded();

SecretKeySpeckey=newSecretKeySpec(enCodeFormat,"AES");

Ciphercipher=Cipher.getInstance("AES");//創建密碼器

cipher.init(Cipher.DECRYPT_MODE,key);//初始化

byte[]result=cipher.doFinal(content);

returnresult;//加密

}catch(NoSuchAlgorithmExceptione){

e.printStackTrace();

}catch(NoSuchPaddingExceptione){

e.printStackTrace();

}catch(InvalidKeyExceptione){

e.printStackTrace();

}catch(IllegalBlockSizeExceptione){

e.printStackTrace();

}catch(BadPaddingExceptione){

e.printStackTrace();

}

returnnull;

}



/**

*加密

*

*@paramcontent需要加密的內容

*@parampassword加密密碼

*@return

*/

publicstaticbyte[]encrypt(Stringcontent,Stringpassword){

try{

KeyGeneratorkgen=KeyGenerator.getInstance("AES");

kgen.init(128,newSecureRandom(password.getBytes()));

SecretKeysecretKey=kgen.generateKey();

byte[]enCodeFormat=secretKey.getEncoded();

SecretKeySpeckey=newSecretKeySpec(enCodeFormat,"AES");

Ciphercipher=Cipher.getInstance("AES");//創建密碼器

byte[]byteContent=content.getBytes("utf-8");

cipher.init(Cipher.ENCRYPT_MODE,key);//初始化

byte[]result=cipher.doFinal(byteContent);

returnresult;//加密

}catch(NoSuchAlgorithmExceptione){

e.printStackTrace();

}catch(NoSuchPaddingExceptione){

e.printStackTrace();

}catch(InvalidKeyExceptione){

e.printStackTrace();

}catch(UnsupportedEncodingExceptione){

e.printStackTrace();

}catch(IllegalBlockSizeExceptione){

e.printStackTrace();

}catch(BadPaddingExceptione){

e.printStackTrace();

}

returnnull;

}

http://blog.csdn.net/hbcui1984/article/details/5201247
圖像界面的話就不說了
閱讀全文

與javaaes128相關的資料

熱點內容
我的世界嗨皮咳嗽伺服器怎麼下 瀏覽:1000
mvn命令順序 瀏覽:978
車貸還完多少時間解壓 瀏覽:964
java頁面開發 瀏覽:816
學編程的小發明 瀏覽:25
為什麼說程序員喜歡格子 瀏覽:253
代碼編譯後叫什麼 瀏覽:969
電腦文件夾做了保護怎麼刪除 瀏覽:678
php資料庫連接全局 瀏覽:528
葫蘆島有程序員嗎 瀏覽:986
小胖機器人顯示無命令 瀏覽:775
一日一畫pdf 瀏覽:97
編程貓拔蘿卜文字評價模板 瀏覽:252
cmdjava命令 瀏覽:237
掃描版pdf轉文字版 瀏覽:535
單片機專用寄存器 瀏覽:501
學習python的手冊 瀏覽:677
vue編譯成js文件 瀏覽:90
給單片機供電的電池 瀏覽:341
什麼app是分享教育的 瀏覽:900