国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于AES加密的Windows Socket網(wǎng)絡(luò)通信實現(xiàn)

2014-03-19 05:43:58閆庚哲
微處理機(jī) 2014年3期
關(guān)鍵詞:網(wǎng)絡(luò)通信密文解密

閆庚哲

(哈爾濱理工大學(xué)軟件學(xué)院,哈爾濱150036)

·微機(jī)網(wǎng)絡(luò)與通信·

基于AES加密的Windows Socket網(wǎng)絡(luò)通信實現(xiàn)

閆庚哲

(哈爾濱理工大學(xué)軟件學(xué)院,哈爾濱150036)

隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,網(wǎng)絡(luò)安全逐漸成為一個潛在的巨大問題。為了保障用戶的自身權(quán)益,提高用戶通信內(nèi)容的安全性就顯得尤為重要。因此,在網(wǎng)絡(luò)通信的傳輸中采用AES高級加密方法,可以有效提高信息傳輸?shù)陌踩?。以Windows Socket網(wǎng)絡(luò)通信方式為例,介紹了應(yīng)用AES加密算法的實現(xiàn),并給出了C++語言代碼。

高級加密標(biāo)準(zhǔn);網(wǎng)絡(luò)安全;加密;網(wǎng)絡(luò)通信;套接字

1 引 言

1.1 AES原理

1.1.1 AES簡介

密碼學(xué)中的高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法。這個標(biāo)準(zhǔn)用來替代原先的DES[1],已經(jīng)被多方分析且廣為全世界所使用。AES[2-5]算法是美國標(biāo)準(zhǔn)技術(shù)研究所(NIST)于2001年11月正式發(fā)布的,它是一種分組加密算法,處理的最小單元是一個分組,即把明文或密文分成固定長度的分組,進(jìn)而進(jìn)行加密或解密處理。AES的分組大小為128比特,可以支持的密鑰長度有128、192、256三種,分別稱為AES-128、AES-192、AES-256,其中又以AES-128應(yīng)用最廣[6]。

1.1.2 AES算法

AES算法中較為重要的是多次迭代操作[7],每一次迭代操作包涵字節(jié)替換(subbyte)、行移位(shiftrow)、列混合(mixcolumns)和輪密鑰混合(addroundkey)等四部分。經(jīng)過多次迭代變化從而提高信息的加密強(qiáng)度。解密過程則為加密過程的逆運算。

1.2 Socket網(wǎng)絡(luò)通信原理

1.2.1 Socket簡介

Socket(套接字)是建立在傳輸層協(xié)議(主要是TCP和UDP)上的一種套接字規(guī)范。Socket具有信息收發(fā)速度快、保密性好、占用服務(wù)器吞吐量小、易于編程實現(xiàn)等優(yōu)點[8]。

Socket接口包含Server Socket(服務(wù)器端,它是通信的響應(yīng)方,它監(jiān)聽以及被動接受客戶端的連接請求,并對請求進(jìn)行回復(fù))和Client Socket(客戶端,它是通信的請求方,主動與服務(wù)器端建立連接)兩個組件。常用的Socket網(wǎng)絡(luò)通信一般采用Client-Server模式,各客戶端都和服務(wù)器端連接。此通信模式結(jié)構(gòu)簡單、編程易實現(xiàn),但各客戶端之間不能直接通信,需通過服務(wù)器端轉(zhuǎn)發(fā)。

1.2.2 Socket通信原理

socket通常也稱作“套接字”[8],用于描述IP地址和端口,是一個通信鏈句柄。應(yīng)用程序通常通過“套接字”向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。服務(wù)器使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關(guān)閉連接??蛻舳耸褂肅lientSocket對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關(guān)閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時、動態(tài)的分配一個1024以上的端口。

2 加密傳輸介紹

發(fā)送方:在本地對明文用私人參數(shù)作AES算法加密,調(diào)用Winsock的發(fā)送處理函數(shù)Send()將加密后的內(nèi)容發(fā)送到網(wǎng)絡(luò)中。

接收方:調(diào)用Winsock的接收處理函數(shù)Recv()獲取網(wǎng)絡(luò)中的密文信息,在本地對密文用私人參數(shù)作AES算法解密。

實現(xiàn)客戶服務(wù)器之間用socket進(jìn)行通信,并且明文查看,密文傳輸?shù)墓δ堋?/p>

3 加密傳輸?shù)腃++實現(xiàn)代碼

3.1 AES算法的C++實現(xiàn)代碼

加密過程和解密過程都是一個周期迭代的過程,以AES-128為例,迭代次數(shù)為10次。數(shù)據(jù)首先和128比特的原始密鑰經(jīng)過addroundkey運算后再進(jìn)行10輪運算。10輪運算由字節(jié)替換(subbyte)、行移位(shiftrow)、列混合(mixcolumns)和輪密鑰混合(addroundkey)組成,其中算法定義最后一輪運算不進(jìn)行列混合操作。

3.1.1 加密的基本C++實現(xiàn)代碼

3.1.1.1 字節(jié)替換

字節(jié)替換運算是一個可逆的非線性字節(jié)代換操作,該運算處理的最小單位是一個字節(jié),也就是4×4字節(jié)矩陣中的一個元素。對字節(jié)的替換操作可以基于一個代換表(又稱S盒)。字節(jié)替換表由兩個獨立變換組成:有限域GF(28)中字節(jié)的乘法逆運算和有限域GF(2)中的仿射變換[9]。

void AES::SubBytes(unsigned char state[][4]){

for(r=0;r<4;r++)for(c=0;c<4;c++)state[r][c]=Sbox[state[r][c]];}

3.1.1.2 行移位

加密中的行移位將每一行進(jìn)行循環(huán)左移位,即最高位字節(jié)移動到最低位字節(jié)。具體移位的數(shù)目與行的序號有關(guān),第零行不進(jìn)行移位,第一行循環(huán)左移一個字節(jié),第二行循環(huán)左移兩個字節(jié),第三行循環(huán)左移三個字節(jié)…。

void AES::ShiftRows(unsigned char state[][4]){

for(r=1;r<4;r++){

for(c=0;c<4;c++)t[c]=state[r][(c+r)%4];

for(c=0;c<4;c++)state[r][c]=t[c];}}

3.1.1.3 列混合

列混合主要以每一列為單位并進(jìn)行處理,每一列看作一個GF(28)[9]下的4位多項式。利用該多項式和c(x)={03}x^3+{01}x^2+{01}x+{02}進(jìn)行多項式乘法,乘法結(jié)果再進(jìn)行取模運算,模的值為(X^4+1)。

void AES::MixColumns(unsigned char state[][4]){

for(c=0;c<4;c++){

for(r=0;r<4;r++)t[r]=state[r][c];

for(r=0;r<4;r++)state[r][c]=FFmul(0x02,t[r])^FFmul(0x03,t[(r+1)%4])^FFmul(0x01,t[(r+2)%4])^FFmul(0x01,t[(r+3)% 4]);}}

unsigned char AES::FFmul(unsigned char a,unsigned char b){

bw[0]=b;

for(i=1;i<4;i++){

bw[i]=bw[i-1]<<1;

if(bw[i-1]&0x80)bw[i]^=0x1b;}

for(i=0;i<4;i++)if((a>>i)&0x01)res^=bw[i];

return res;}

3.1.1.4 輪密鑰混合

簡單來說就是逐字節(jié)相加,有限域GF(28)上的加法是模2加法,即異或

void AES::AddRoundKey(unsigned char state[][4],unsigned char k[][4]){

for(c=0;c<4;c++)for(r=0;r<4;r++)state[r][c]^=k[r][c];}

3.1.1.5 密鑰擴(kuò)展

將輸入的密鑰擴(kuò)展為11組128位密鑰組,其中第0組為輸入密鑰本身,其后第n組第i列為第n-1組第i列與第n組第i-1列之和(模2加法,1<=i<=3)

void AES::KeyExpansion(unsigned char*key,unsigned char w[][4][4]){

unsigned char rc[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};

for(r=0;r<4;r++)for(c=0;c<4;c++)w[0][r][c]=key[r+c*4];

for(i=1;i<=10;i++)for(j=0;j<4;j++){

unsigned char t[4];

for(r=0;r<4;r++)t[r]=j(luò)?w[i][r][j-1]:w[i-1][r][3];

if(j==0){

unsigned char temp=t[0];

for(r=0;r<3;r++)t[r]=Sbox[t[(r+1)% 4]];

t[3]=Sbox[temp];

t[0]^=rc[i-1];}

for(r=0;r<4;r++)w[i][r][j]=w[i-1][r][j]^t[r];}}

3.1.2 解密的基本C++實現(xiàn)代碼

解密算法,基本運算中除了AddRoundKey(輪密鑰加)不變外,其余的都需要進(jìn)行逆變換。即Inv-SubBytes(逆字節(jié)替代)、InvShiftRows(逆行移位)、InvMixColumns(逆列混淆)。

void AES::InvSubBytes(unsigned char state[][4]){

for(r=0;r<4;r++)for(c=0;c<4;c++)state[r][c]=InvSbox[state[r][c]];}

void AES::InvShiftRows(unsigned char state[][4]){;

for(r=1;r<4;r++){

for(c=0;c<4;c++)t[c]=state[r][(c-r+4)%4];

for(c=0;c<4;c++)state[r][c]=t[c];}}

void AES::InvMixColumns(unsigned char state[][4]){

for(c=0;c<4;c++){

for(r=0;r<4;r++)t[r]=state[r][c];

for(r=0;r<4;r++)state[r][c]=FFmul(0x0e,t[r])^FFmul(0x0b,t[(r+1)%4])^FFmul(0x0d,t[(r+2)%4])^FFmul(0x09,t[(r+3)% 4]);}}

3.1.3 加密過程的C++實現(xiàn)代碼

先將輸入的明文按列序組合成4×4矩陣,直接與第0組密鑰(即輸入的密鑰)相加(異或),作為輪加密的輸入。然后循環(huán)10次進(jìn)行SubBytes、ShiftRows、MixColumns、AddRoundKey運算,最后恢復(fù)原序列。需要注意的是最后一輪并不進(jìn)行Mix-Columns(列混淆變換)。

unsigned char*AES::Cipher(unsigned char* input){

for(r=0;r<4;r++)for(c=0;c<4;c++)state[r][c]=input[c*4+r];

AddRoundKey(state,w[0]);

for(i=1;i<=10;i++){

SubBytes(state);

ShiftRows(state);

if(i?。?0)MixColumns(state);

AddRoundKey(state,w[i]);}

for(r=0;r<4;r++)for(c=0;c<4;c++)input[c*4+r]=state[r][c];

return input;}

3.1.4 解密過程的C++實現(xiàn)代碼

unsigned char*AES::InvCipher(unsigned char *input){

for(r=0;r<4;r++)for(c=0;c<4;c++)state[r][c]=input[c*4+r];

AddRoundKey(state,w[10]);

for(i=9;i>=0;i--){

InvShiftRows(state);

InvSubBytes(state);

AddRoundKey(state,w[i]);

if(i)InvMixColumns(state);}

for(r=0;r<4;r++)for(c=0;c<4;c++)input[c*4+r]=state[r][c];

return input;}

3.2 Socket通信的C++實現(xiàn)代碼

3.2.1 客戶端加密發(fā)送的C++實現(xiàn)代碼

void__fastcall TForm1::btnclientSendClick(TObject*Sender){

AES aes;//讀入密鑰文件

FileRead(keyFile,(char*)key,16);//讀入明文并加密

while(FileRead(plainFile,(char*)plainText,16))

cipherText=aes.Cipher(plainText,key,16);//發(fā)送密文

AnsiString cipher;

cipher=AnsiString((char*)cipherText);

ClientSocket->Socket->SendText(cipher);}

3.2.2 服務(wù)器解密接收的C++實現(xiàn)代碼

void__fastcall TForm1::btnDecryptClick(TObject*Sender){

AES aes;//讀入解密密鑰

FileRead(keyFile,(char*)key,16);//讀入解密密文

while(FileRead(cipherFile,(char*)cipher-Text,16))

plainText=aes.InvCipher(cipherText,key,16);//接收密文

AnsiStringmemoPlain;

memoPlain=(AnsiString)((char*)plain-Text);

Memo1->Lines->Add(memoPlain);}

4 結(jié)束語

隨著互聯(lián)網(wǎng)技術(shù)的高速發(fā)展,尤其是互聯(lián)網(wǎng)的應(yīng)用變得越來越廣泛,在帶來海量信息的同時,網(wǎng)絡(luò)的開放性和自由性也產(chǎn)生了私有信息被泄露的可能性,網(wǎng)絡(luò)信息的安全性變得日益重要起來。對于目前存在的網(wǎng)絡(luò)安全問題,為了提高信息傳輸?shù)陌踩?,該文以Windows Socket網(wǎng)絡(luò)通信方式為例,采用AES的高級加密方法進(jìn)行加密傳輸,可以有效避免信息在傳輸過程中被別人竊用。

[1]張潔,朱麗娟.DES加密算法分析與實現(xiàn)[J].軟件導(dǎo)刊,2007(3):95-97.

[2]Daemen J,Rijmen V.The Design of Rijndael:AES-the Advanced Encryption Standard[M].Berlin:Springer-Verlag,2012.

[3]Kuleuven.A Polynomial Description:The Original Description of Rijndael[EB/OL].ESAT:Kuleuven,2010.http://www.esat.kuleuven.ac.be/rijmen/rijndael/1.net.

[4]何明星,范平志.新一代私鑰加密標(biāo)準(zhǔn)AES進(jìn)展與評述[J].計算機(jī)應(yīng)用研究,2001,18(10):4-6.

[5]吳小博.AES加密算法分析與C++編程實現(xiàn)[J]計算機(jī)安全,2007(12):44-46.

[6]單玉峰,潘孟賢.一種新的加密標(biāo)準(zhǔn)AES[J].信息技術(shù),2002(11):32-33.

[7]何明星,范平志.新一代私鑰加密標(biāo)準(zhǔn)AES進(jìn)展與評述[J].計算機(jī)應(yīng)用研究,2001(10):4.

[8]王茂林,賀富強(qiáng).Socket在局域網(wǎng)通信中的應(yīng)用[J].艦船電子工程,2006,26(5):93-95.

[9]NIST.Announcing the ADVANCED ENCRYPTION STANDARD(AES)[M].America:Springer-Verlag,2001.

Implement of AES-based Encryption Windows Socket Network Communication

YAN Geng-zhe
(College of Software,Harbin University of Technology,Harbin 150036,China)

With the rapid development of internet technology,network security has become a potentially huge problem.In order to protect the rights and interests of user's own,security of user communication content should be focused on particularly.Therefore,AESAdvanced Encryption method is used in the network communication to effectively improve the security of information transmission.Windows socket network communication is given an example,the application of the AES encryption algorithm is described and the C++language code is shown in this paper.

AES;Network security;Encryption;Network communication;Socket

10.3969/j.issn.1002-2279.2014.03.005

TP393

:B

:1002-2279(2014)03-0014-04

閆庚哲(1993-),男,黑龍江哈爾濱人,本科,主研方向:軟件工程。

2013-11-21

猜你喜歡
網(wǎng)絡(luò)通信密文解密
解密“熱脹冷縮”
一種針對格基后量子密碼的能量側(cè)信道分析框架
一種支持動態(tài)更新的可排名密文搜索方案
基于模糊數(shù)學(xué)的通信網(wǎng)絡(luò)密文信息差錯恢復(fù)
解密“一包三改”
少先隊活動(2020年9期)2020-12-17 06:17:31
炫詞解密
基于網(wǎng)絡(luò)通信的智能照明系統(tǒng)設(shè)計
電子制作(2019年15期)2019-08-27 01:11:48
網(wǎng)絡(luò)通信中信息隱藏技術(shù)的應(yīng)用
基于網(wǎng)絡(luò)通信的校園智能音箱設(shè)計
電子制作(2018年1期)2018-04-04 01:48:30
談計算機(jī)網(wǎng)絡(luò)通信常見問題及技術(shù)發(fā)展
電子制作(2017年17期)2017-12-18 06:41:06
朝阳市| 咸宁市| 饶阳县| 海南省| 突泉县| 本溪市| 介休市| 含山县| 磐安县| 栾城县| 梁平县| 元氏县| 南木林县| 鹿邑县| 乌兰浩特市| 栾城县| 永城市| 青铜峡市| 渑池县| 亚东县| 精河县| 绥滨县| 平阳县| 盱眙县| 晋江市| 长丰县| 长海县| 连南| 通州区| 游戏| 慈利县| 嘉荫县| 忻城县| 明光市| 思茅市| 崇义县| 班玛县| 光泽县| 冷水江市| 镇巴县| 尖扎县|