DH交換的數(shù)據(jù)如何傳輸加密

隨著信息產(chǎn)業(yè)的發(fā)展和互聯(lián)網(wǎng)絡(luò)的日益壯大,越來(lái)越多的單位和個(gè)人加入了互聯(lián)網(wǎng)絡(luò)的行列。通過(guò)Internet相互傳送信息然而,在不保密的信道上傳送信息很容易被截獲。一旦重要信息落入居心巨測(cè)的人手中,后果將是十分嚴(yán)重的為此如何保護(hù)好網(wǎng)絡(luò)用戶的利益,確保用戶信息安全,使得Internet上的數(shù)據(jù)傳輸安全己成為當(dāng)今網(wǎng)絡(luò)工作者的一個(gè)重點(diǎn)研究課題。

一、DH交換實(shí)現(xiàn)

要實(shí)現(xiàn)基于TCP協(xié)議的安全數(shù)據(jù)傳輸,首先要實(shí)現(xiàn)密鑰分發(fā)的問(wèn)題只有雙方協(xié)商好相同的密鑰之后,才能進(jìn)行數(shù)據(jù)的加密和解密功能,本文選擇根據(jù)Diffile- HeLlman- Merkle算法進(jìn)行密鑰協(xié)商,因?yàn)榉菍?duì)稱算法能夠很好的通過(guò)明文數(shù)據(jù)協(xié)商成功安全的密鑰,下面研究一下DH交換的實(shí)現(xiàn)。

無(wú)論客戶端或者是服務(wù)器都會(huì)按照下面順序執(zhí)行。

(1)調(diào)用DH M-setalice(void),生成隨機(jī)數(shù)DH M-arlice(它是不公開的);

(2)調(diào)用D'HM-SETALPHA( void),生成DH M-alpha(發(fā)送給目標(biāo)機(jī));

(3)調(diào)用DH M-ealcomkey( uint3 2-tDHM—beta),根據(jù)獲取到的DHM -beta生成會(huì)話密鑰DH M-eomkey;

下面是全局變量const uint32-t- DHM4-5:

const uint32-t- DHM-L=5;

const uint32-t- DHM-P= 11://可以任意定義

uint32-t DHMrrlice;//調(diào)用隨機(jī)函數(shù)生成define DHM-ALICE-4\4AX 8 //如果太大了計(jì)算會(huì)出錯(cuò)

uint32-t- DHM-alpha; //calculate by DHM-alice

uint32~- DHM-eomkey, //會(huì)話密鑰

其中DHM4和DHM-P可以是隨機(jī)常量并且DHM-P要大于DHM4/jclient和server是要一 樣的。

DHM_alice是根據(jù)當(dāng)前時(shí)間獲取的隨機(jī)DHMllice值,這個(gè)值要保密調(diào)用下面的函數(shù)獲取。

uint32-t- DHM-setalice( void) {

int flag-time(NULL);

srand(flag);

DHM-alice - rand()%DHM -ALICE -MAX,

Return DHM-alice;

}

DHM-alpha也是要計(jì)算出來(lái)的,它是根據(jù)DH M-*lice計(jì)算出來(lái)的,如下:

Uint3 2-+ DH M-set alpha( void.)

DHM-lpha

(uint32-書pow(( dou ble) DH M4,( double)

DH M-zrlice) %DHM-P;

Return DH M-alpha;

}

之后就把DHM-alpha給遠(yuǎn)程主機(jī)并且接收DH M-beta并根據(jù)它來(lái)計(jì)算DH M-eomkey:

Uint32-t- DH M-ealcomk ey( uint3 2-t- DHM-beta)//recv from peert DH M-eomkey

( uint3 2+) pow((double) DHM-beta,(double):

DHM-(lice) ~6DHM-P;

Rerurn DH M-eomkey;))

在client和server同時(shí)做同樣的工作,它們便能獲取到公共的會(huì)話密鑰當(dāng)獲取了公共密鑰后,就可以調(diào)用加密算法進(jìn)行文本加密了,下面是DH算法實(shí)現(xiàn)后的運(yùn)行結(jié)果,雙方協(xié)商生成的加密密鑰為4:

在 client運(yùn)行程序如下 :

Yao @ twomoon:/project/ ftt /client $ . /ftt

fft> connect 127. 0. 0: 1

DH M-alice: 2

DHM-alpha: 3

recv package :

cmd; Ox00000001 0ption : Ox000000001

data : Ox00000009

DH M-beta: 9

DH M-eomkey : 4

ftt>.

在 server運(yùn)行程序如下 :

Yao @twomoon:—x一/project/ftr/server $ ./fttd

Recv package cmd:Ox00000001

option :Ox00000000 len :Ox00000014

It is package CMD-SEND-PUBKEY

DH M-alice: 4

DHMrlpha: 9

DH M-beta: 3

Send package CMD-SEND-PUBKEY secuss

DH M-eomkey : 4

二、aesar算法

上面已經(jīng)實(shí)現(xiàn)了通過(guò)DH交換生成加密密鑰,下面就需要實(shí)現(xiàn)加密算法,即Laesar算法的程序?qū)崿F(xiàn)首先傳輸?shù)亩际怯罘麛?shù)據(jù)所以需要對(duì)宇符進(jìn)行加密處理,將該字符轉(zhuǎn)化成對(duì)應(yīng)的Int類型,然后將該數(shù)字加上通過(guò)協(xié)商生成的key值,生成新加密的字符對(duì)應(yīng)的數(shù)字.最后將該數(shù)字轉(zhuǎn)化為字符,得到最終加密后的字符,實(shí)現(xiàn)數(shù)據(jù)的加密(原來(lái)的int數(shù)據(jù)加上key后,可能超過(guò)字符的最大取值,所以使用取模的方式,超過(guò)最大后重第一個(gè)字符算起)。

Caesar算法實(shí)現(xiàn)

//Caes ar加密算法.key為協(xié)商后生成的密鑰

Char encrypt(char in,int key){

Char chin;

Int x}

X- static-east (in);

X= (x+key) %128;

Chin- static-east-(x);

RetLirn chin;

上面實(shí)現(xiàn)了加密的算法.解密的算法和加密的算法類似,只是解密是把獲取的字符減去key值,然后還原出真實(shí)的數(shù)據(jù)信息。

三、數(shù)據(jù)實(shí)時(shí)加密實(shí)現(xiàn)

算法實(shí)現(xiàn)后還需要解決如何在數(shù)據(jù)實(shí)時(shí)傳輸時(shí)進(jìn)行加密的問(wèn)題,本次考慮了兩種實(shí)時(shí)加密的實(shí)現(xiàn)方式,分別對(duì)這兩種方法進(jìn)行分析,選擇合適的方式來(lái)實(shí)現(xiàn)數(shù)據(jù)傳輸時(shí)實(shí)時(shí)加密。

第一種方式就是先加密文件,再將已經(jīng)加密的文件讀取后封裝到數(shù)據(jù)包,傳輸?shù)綄?duì)端,然后刪除加密后的中間文件,還原到最初的狀態(tài)這種處理方式需要先生成中間的加密文件,這樣既消耗了磁盤的存儲(chǔ)空間,存在大量的無(wú)用的中間文件,而且需要對(duì)硬盤進(jìn)行頻繁的讀寫,消耗I/O和C.PU處理最后還需要清理中間數(shù)據(jù),增加了額外的處理不過(guò)該方式的優(yōu)點(diǎn)是可以直接調(diào)用socket的send函數(shù)傳輸數(shù)據(jù),因?yàn)閭鬏數(shù)臄?shù)據(jù)就已經(jīng)是加過(guò)密的數(shù)據(jù)但是考慮到傳輸?shù)臄?shù)據(jù)可能非常大在過(guò)多的硬盤操作處理和加密中,對(duì)于效率影響非常大,故不采用該實(shí)現(xiàn)方式。

另外的一種加密方式是直接讀取未加密的數(shù)據(jù),在讀取數(shù)據(jù)之后,封裝為傳輸數(shù)據(jù)包之前,將該數(shù)據(jù)進(jìn)行加密這種加密方式的優(yōu)點(diǎn)是不需要對(duì)原始數(shù)據(jù)進(jìn)行任何處理。加密時(shí)直接重發(fā)送緩沖區(qū)讀取數(shù)據(jù)執(zhí)行加密由于是內(nèi)存操作,加密速度快,也不會(huì)生成冗余的文件加密完成后,在調(diào)用send函數(shù)將數(shù)據(jù)發(fā)送到對(duì)端對(duì)端接收到數(shù)據(jù)用,也先執(zhí)行解密,然后在存放到本地,下面是具體的實(shí)現(xiàn):

Bzero( buffer.BUFFER-SIZE):

//這里完成了將需要發(fā)送的數(shù)據(jù)讀取到緩沖數(shù)組

Strcpy( buffer "'Hello, World!From Client\n");

//對(duì)發(fā)送數(shù)據(jù)進(jìn)行加密

For(int i-0;i!=1024; ++i)

Buffe:rn]=encrypt( bufferri].key).;

//客戶端發(fā)送數(shù)據(jù)給服務(wù)器端

If( send( client-socket, buffer, BUFFER-SIZE, O).<0)

Perror("send")

}

//中斷連接

Close( client-socket)i

Return O;

}

接收方在完成recv后,調(diào)用解密函數(shù)對(duì)于已經(jīng)加密的數(shù)據(jù)進(jìn)行解密,還原成原始的數(shù)據(jù)信息,實(shí)現(xiàn)在傳輸過(guò)程中的實(shí)時(shí)加密數(shù)據(jù)傳輸,實(shí)現(xiàn)的方式和加密方式類似。

小知識(shí)之信道

指通信的通道,是信號(hào)傳輸?shù)拿浇椤?/p>