真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javaaes原代碼 javaee代碼

如何使用java對(duì)密碼加密 加密方式aes

Java有相關(guān)的實(shí)現(xiàn)類:具體原理如下

創(chuàng)新互聯(lián)公司是專業(yè)的贛縣網(wǎng)站建設(shè)公司,贛縣接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行贛縣網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

對(duì)于任意長(zhǎng)度的明文,AES首先對(duì)其進(jìn)行分組,每組的長(zhǎng)度為128位。分組之后將分別對(duì)每個(gè)128位的明文分組進(jìn)行加密。

對(duì)于每個(gè)128位長(zhǎng)度的明文分組的加密過(guò)程如下:

(1)將128位AES明文分組放入狀態(tài)矩陣中。

(2)AddRoundKey變換:對(duì)狀態(tài)矩陣進(jìn)行AddRoundKey變換,與膨脹后的密鑰進(jìn)行異或操作(密鑰膨脹將在實(shí)驗(yàn)原理七中詳細(xì)討論)。

(3)10輪循環(huán):AES對(duì)狀態(tài)矩陣進(jìn)行了10輪類似的子加密過(guò)程。前9輪子加密過(guò)程中,每一輪子加密過(guò)程包括4種不同的變換,而最后一輪只有3種變換,前9輪的子加密步驟如下:

● SubBytes變換:SubBytes變換是一個(gè)對(duì)狀態(tài)矩陣非線性的變換;

● ShiftRows變換:ShiftRows變換對(duì)狀態(tài)矩陣的行進(jìn)行循環(huán)移位;

● MixColumns變換:MixColumns變換對(duì)狀態(tài)矩陣的列進(jìn)行變換;

● AddRoundKey變換:AddRoundKey變換對(duì)狀態(tài)矩陣和膨脹后的密鑰進(jìn)行異或操作。

最后一輪的子加密步驟如下:

● SubBytes變換:SubBytes變換是一個(gè)對(duì)狀態(tài)矩陣非線性的變換;

● ShiftRows變換:ShiftRows變換對(duì)狀態(tài)矩陣的行進(jìn)行循環(huán)移位;

● AddRoundKey變換:AddRoundKey變換對(duì)狀態(tài)矩陣和膨脹后的密鑰進(jìn)行異或操作;

(4)經(jīng)過(guò)10輪循環(huán)的狀態(tài)矩陣中的內(nèi)容就是加密后的密文。

AES的加密算法的偽代碼如下。

在AES算法中,AddRoundKey變換需要使用膨脹后的密鑰,原始的128位密鑰經(jīng)過(guò)膨脹會(huì)產(chǎn)生44個(gè)字(每個(gè)字為32位)的膨脹后的密鑰,這44個(gè)字的膨脹后的密鑰供11次AddRoundKey變換使用,一次AddRoundKey使用4個(gè)字(128位)的膨脹后的密鑰。

三.AES的分組過(guò)程

對(duì)于任意長(zhǎng)度的明文,AES首先對(duì)其進(jìn)行分組,分組的方法與DES相同,即對(duì)長(zhǎng)度不足的明文分組后面補(bǔ)充0即可,只是每一組的長(zhǎng)度為128位。

AES的密鑰長(zhǎng)度有128比特,192比特和256比特三種標(biāo)準(zhǔn),其他長(zhǎng)度的密鑰并沒(méi)有列入到AES聯(lián)邦標(biāo)準(zhǔn)中,在下面的介紹中,我們將以128位密鑰為例。

四.狀態(tài)矩陣

狀態(tài)矩陣是一個(gè)4行、4列的字節(jié)矩陣,所謂字節(jié)矩陣就是指矩陣中的每個(gè)元素都是一個(gè)1字節(jié)長(zhǎng)度的數(shù)據(jù)。我們將狀態(tài)矩陣記為State,State中的元素記為Sij,表示狀態(tài)矩陣中第i行第j列的元素。128比特的明文分組按字節(jié)分成16塊,第一塊記為“塊0”,第二塊記為“塊1”,依此類推,最后一塊記為“塊15”,然后將這16塊明文數(shù)據(jù)放入到狀態(tài)矩陣中,將這16塊明文數(shù)據(jù)放入到狀態(tài)矩陣中的方法如圖2-2-1所示。

塊0

塊4

塊8

塊12

塊1

塊5

塊9

塊13

塊2

塊6

塊10

塊14

塊3

塊7

塊11

塊15

圖2-2-1 將明文塊放入狀態(tài)矩陣中

五.AddRoundKey變換

狀態(tài)矩陣生成以后,首先要進(jìn)行AddRoundKey變換,AddRoundKey變換將狀態(tài)矩陣與膨脹后的密鑰進(jìn)行按位異或運(yùn)算,如下所示。

其中,c表示列數(shù),數(shù)組W為膨脹后的密鑰,round為加密輪數(shù),Nb為狀態(tài)矩陣的列數(shù)。

它的過(guò)程如圖2-2-2所示。

圖2-2-2 AES算法AddRoundKey變換

六.10輪循環(huán)

經(jīng)過(guò)AddRoundKey的狀態(tài)矩陣要繼續(xù)進(jìn)行10輪類似的子加密過(guò)程。前9輪子加密過(guò)程中,每一輪要經(jīng)過(guò)4種不同的變換,即SubBytes變換、ShiftRows變換、MixColumns變換和AddRoundKey變換,而最后一輪只有3種變換,即SubBytes變換、ShiftRows變換和AddRoundKey變換。AddRoundKey變換已經(jīng)討論過(guò),下面分別討論余下的三種變換。

1.SubBytes變換

SubBytes是一個(gè)獨(dú)立作用于狀態(tài)字節(jié)的非線性變換,它由以下兩個(gè)步驟組成:

(1)在GF(28)域,求乘法的逆運(yùn)算,即對(duì)于α∈GF(28)求β∈GF(28),使αβ =βα = 1mod(x8 + x4 + x3 + x + 1)。

(2)在GF(28)域做變換,變換使用矩陣乘法,如下所示:

由于所有的運(yùn)算都在GF(28)域上進(jìn)行,所以最后的結(jié)果都在GF(28)上。若g∈GF(28)是GF(28)的本原元素,則對(duì)于α∈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)

根據(jù)SubBytes變換算法,可以得出SubBytes的置換表,如表2-2-1所示,這個(gè)表也叫做AES的S盒。該表的使用方法如下:狀態(tài)矩陣中每個(gè)元素都要經(jīng)過(guò)該表替換,每個(gè)元素為8比特,前4比特決定了行號(hào),后4比特決定了列號(hào),例如求SubBytes(0C)查表的0行C列得FE。

表2-2-1 AES的SubBytes置換表

它的變換過(guò)程如圖2-2-3所示。

圖2-2-3 SubBytes變換

AES加密過(guò)程需要用到一些數(shù)學(xué)基礎(chǔ),其中包括GF(2)域上的多項(xiàng)式、GF(28)域上的多項(xiàng)式的計(jì)算和矩陣乘法運(yùn)算等,有興趣的同學(xué)請(qǐng)參考相關(guān)的數(shù)學(xué)書(shū)籍。

2.ShiftRows變換

ShiftRows變換比較簡(jiǎn)單,狀態(tài)矩陣的第1行不發(fā)生改變,第2行循環(huán)左移1字節(jié),第3行循環(huán)左移2字節(jié),第4行循環(huán)左移3字節(jié)。ShiftRows變換的過(guò)程如圖2-2-4所示。

圖2-2-4 AES的ShiftRows變換

3.MixColumns變換

在MixColumns變換中,狀態(tài)矩陣的列看作是域GF(28)的多項(xiàng)式,模(x4+1)乘以c(x)的結(jié)果:

c(x)=(03)x3+(01)x2+(01)x+(02)

這里(03)為十六進(jìn)制表示,依此類推。c(x)與x4+1互質(zhì),故存在逆:

d(x)=(0B)x3+(0D)x2+(0G)x+(0E)使c(x)?d(x) = (D1)mod(x4+1)。

設(shè)有:

它的過(guò)程如圖2-2-5所示。

圖2-2-5 AES算法MixColumns變換

七.密鑰膨脹

在AES算法中,AddRoundKey變換需要使用膨脹后的密鑰,膨脹后的密鑰記為子密鑰,原始的128位密鑰經(jīng)過(guò)膨脹會(huì)產(chǎn)生44個(gè)字(每個(gè)字為32位)的子密鑰,這44個(gè)字的子密鑰供11次AddRoundKey變換使用,一次AddRoundKey使用4個(gè)字(128位)的膨脹后的密鑰。

密鑰膨脹算法是以字為基礎(chǔ)的(一個(gè)字由4個(gè)字節(jié)組成,即32比特)。128比特的原始密鑰經(jīng)過(guò)膨脹后將產(chǎn)生44個(gè)字的子密鑰,我們將這44個(gè)密鑰保存在一個(gè)字?jǐn)?shù)組中,記為W[44]。128比特的原始密鑰分成16份,存放在一個(gè)字節(jié)的數(shù)組:Key[0],Key[1]……Key[15]中。

在密鑰膨脹算法中,Rcon是一個(gè)10個(gè)字的數(shù)組,在數(shù)組中保存著算法定義的常數(shù),分別為:

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

另外,在密鑰膨脹中包括其他兩個(gè)操作RotWord和SubWord,下面對(duì)這兩個(gè)操作做說(shuō)明:

RotWord( B0,B1,B2,B3 )對(duì)4個(gè)字節(jié)B0,B1,B2,B3進(jìn)行循環(huán)移位,即

RotWord( B0,B1,B2,B3 ) = ( B1,B2,B3,B0 )

SubWord( B0,B1,B2,B3 )對(duì)4個(gè)字節(jié)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。

密鑰膨脹的算法如下:

八.解密過(guò)程

AES的加密和解密過(guò)程并不相同,首先密文按128位分組,分組方法和加密時(shí)的分組方法相同,然后進(jìn)行輪變換。

AES的解密過(guò)程可以看成是加密過(guò)程的逆過(guò)程,它也由10輪循環(huán)組成,每一輪循環(huán)包括四個(gè)變換分別為InvShiftRows變換、InvSubBytes變換、InvMixColumns變換和AddRoundKey變換;

這個(gè)過(guò)程可以描述為如下代碼片段所示:

九.InvShiftRows變換

InvShiftRows變換是ShiftRows變換的逆過(guò)程,十分簡(jiǎn)單,指定InvShiftRows的變換如下。

Sr,(c+shift(r,Nb))modNb= Sr,c for 0 r 4 and 0 ≤ c Nb

圖2-2-6演示了這個(gè)過(guò)程。

圖2-2-6 AES算法InvShiftRows變換

十.InvSubBytes變換

InvSubBytes變換是SubBytes變換的逆變換,利用AES的S盒的逆作字節(jié)置換,表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)

上面的內(nèi)容可以描述為以下的矩陣乘法:

十二.AddRoundKey變換

AES解密過(guò)程的AddRoundKey變換與加密過(guò)程中的AddRoundKey變換一樣,都是按位與子密鑰做異或操作。解密過(guò)程的密鑰膨脹算法也與加密的密鑰膨脹算法相同。最后狀態(tài)矩陣中的數(shù)據(jù)就是明文。

求一款java的AES加密解密的軟件源代碼(完整)

#include stdio.h

#include stdlib.h

#include fcntl.h

#include unistd.h

#define JIA_SIZE 1024

#define M_S 25

//加密菜單

void menu()

{

puts("(1)加密");

puts("(2)解密");

puts("(3)退出");

}

//加密

void jiami(const char *path/*加密路徑*/)

{

int i;

int fp,len;

char buffer[1024];

puts("正在加密... ...");

fp = open(path,O_RDWR); //open以讀寫方式打開(kāi)

len=read(fp,buffer,1024);

puts("將要加密的數(shù)據(jù)");

puts(buffer);

printf("字符一共有: %d\n",len);

puts("準(zhǔn)備加密");

for(i=0;ilen;i++)

{

buffer[i] ^= M_S;

}

lseek(fp,0,SEEK_SET);

write(fp,buffer,len);

close(fp); //關(guān)閉文件

}

int main(int argc,char *argv[])

{

FILE *fp;

char buffer[JIA_SIZE];

char ch;

if(argc 2){ //如果沒(méi)有輸入路徑就錯(cuò)誤

puts("請(qǐng)輸入正確的參數(shù)比如: ./jiami /home/long/bin/123.txt");

return 0;

}

else{//顯示加密或者解密路徑

printf("你加密或者解密的路徑:");

puts(argv[1]);

}

menu(); //顯示菜單

switch(ch=getchar())

{

case '1'://加密

jiami(argv[1]);

break;

case '2'://解密

jiami(argv[1]);

break;

case '3'://退出

return 0;

break;

defualt:

puts("請(qǐng)輸入正確的菜單參數(shù)(1-3)");

}

return 0;

}

java aes加密 如何用php 進(jìn)行解密,以下是java代碼,求php 代碼如何寫 (主要是createkey 那個(gè)方法)

先看用什么方式的加密,拿AES來(lái)說(shuō),你需要問(wèn)java要到混淆值、初始化向量與AES加密的方式如AES-192-CFB.然后直接調(diào)用openssl_decrypt方法進(jìn)行解密.

openssl_decrypt('需要解密的字符串','AES-192-CFB','混淆值',0,'初始化向量'),true)


本文名稱:javaaes原代碼 javaee代碼
本文網(wǎng)址:http://weahome.cn/article/dogijcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部