當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 密碼管理 » javaaes文件加密

javaaes文件加密-九游会j9娱乐平台

發布時間: 2024-06-29 22:48:09

1. 如何使用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變換一樣,都是按位與子密鑰做異或操作。解密過程的密鑰膨脹演算法也與加密的密鑰膨脹演算法相同。最後狀態矩陣中的數據就是明文。

2. 求一個java演算法,用128位密鑰的aes加密128位明文,得出的密文還是128位...很著急,非常感謝各位大神,求救!

/**
* 加密
*
* @param content 需要加密的內容
* @param password 加密密碼
* @return
*/
public static byte[] encrypt(string content, string password) {
try {
keygenerator kgen = keygenerator.getinstance("aes");
kgen.init(128, new securerandom(password.getbytes()));
secretkey secretkey = kgen.generatekey();
byte[] encodeformat = secretkey.getencoded();
secretkeyspec key = new secretkeyspec(encodeformat, "aes");
cipher cipher = cipher.getinstance("aes");// 創建密碼器
byte[] bytecontent = content.getbytes("utf-8");
cipher.init(cipher.encrypt_mode, key);// 初始化
byte[] result = cipher.dofinal(bytecontent);
return result; // 加密
} catch (nosuchalgorithmexception e) {
e.printstacktrace();
} catch (nosuchpaddingexception e) {
e.printstacktrace();
} catch (invalidkeyexception e) {
e.printstacktrace();
} catch (unsupportedencodingexception e) {
e.printstacktrace();
} catch (illegalblocksizeexception e) {
e.printstacktrace();
} catch (badpaddingexception e) {
e.printstacktrace();
}
return null;
}

3. java使用aes/cbc/pkcs5方式加密的內容,怎樣在c#下解密

java和c#只是語言,aes這些是演算法,所以和語言沒太大關系,
java加密的「1」和c#加密的「1」結果是一樣的,解密出來也是一樣的。
///
///aes解密
///

///密文字元串
///返回明文字元串
publicstaticstringaesdecrypt(stringshowtext)
{
byte[]ciphertext=convert.frombase64string(showtext);
symmetricalgorithmdes=rijndael.create();
des.key=encoding.utf8.getbytes(key);
des.iv=_key1;
byte[]decryptbytes=newbyte[ciphertext.length];
using(memorystreamms=newmemorystream(ciphertext))
{
using(cryptostreamcs=newcryptostream(ms,des.createdecryptor(),cryptostreammode.read))
{
cs.read(decryptbytes,0,decryptbytes.length);
cs.close();
ms.close();
}
}
returnencoding.utf8.getstring(decryptbytes).replace("","");///將字元串後尾的''去掉
}
}
上文為使用c#進行aes解密,其他的可以自行網路。

4. java aes加密

使用aes加密時,當密鑰大於128時,代碼會拋出java.security.invalidkeyexception: illegal key size or default parameters

illegal key size or default parameters是指密鑰長度是受限制的,java運行時環境讀到的是受限的policy文件。文件位於${java_home}/jre/lib/security

這種限制是因為美國對軟體出口的控制。

解決辦法:
去掉這種限制需要下載java cryptography extension (jce) unlimited strength jurisdiction policy files.網址如下。

下載包的readme.txt 有安裝說明。就是替換${java_home}/jre/lib/security/ 下面的local_policy.jar和us_export_policy.jar
jdk 5: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jce_policy-1.5.0-oth-jpr

熱點內容
resin下jsp不能正常編譯 發布:2024-07-17 16:34:44 瀏覽:229
sqlserver如何切換主備伺服器 發布:2024-07-17 16:23:02 瀏覽:299
mc18伺服器ip 發布:2024-07-17 16:23:02 瀏覽:379
仙境傳說手游腳本 發布:2024-07-17 16:09:24 瀏覽:691
matlab命令窗口和新建腳本 發布:2024-07-17 15:51:26 瀏覽:375
建ftp文件夾 發布:2024-07-17 15:51:26 瀏覽:955
魔獸撿物腳本 發布:2024-07-17 15:27:56 瀏覽:130
開發ip伺服器 發布:2024-07-17 15:24:42 瀏覽:388
安卓系統視頻製作哪個好用 發布:2024-07-17 15:10:47 瀏覽:210
androidapk結構 發布:2024-07-17 15:10:43 瀏覽:945
网站地图