随着信息产业的发展和互联网络的日益壮大,越来越多的单位和个人加入了互联网络的行列。通过Internet相互传送信息然而,在不保密的信道上传送信息很容易被截获。一旦重要信息落入居心巨测的人手中,后果将是十分严重的为此如何保护好网络用户的利益,确保用户信息安全,使得Internet上的数据传输安全己成为当今网络工作者的一个重点研究课题。

一、DH交换实现

要实现基于TCP协议的安全数据传输,首先要实现密钥分发的问题只有双方协商好相同的密钥之后,才能进行数据的加密和解密功能,本文选择根据Diffile- HeLlman- Merkle算法进行密钥协商,因为非对称算法能够很好的通过明文数据协商成功安全的密钥,下面研究一下DH交换的实现。

无论客户端或者是服务器都会按照下面顺序执行。

(1)调用DH M-setalice(void),生成随机数DH M-arlice(它是不公开的);

(2)调用D'HM-SETALPHA( void),生成DH M-alpha(发送给目标机);

(3)调用DH M-ealcomkey( uint3 2-tDHM—beta),根据获取到的DHM -beta生成会话密钥DH M-eomkey;

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

const uint32-t- DHM-L=5;

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

uint32-t DHMrrlice;//调用随机函数生成define DHM-ALICE-4\4AX 8 //如果太大了计算会出错

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

uint32~- DHM-eomkey, //会话密钥

其中DHM4和DHM-P可以是随机常量并且DHM-P要大于DHM4/jclient和server是要一 样的。

DHM_alice是根据当前时间获取的随机DHMllice值,这个值要保密调用下面的函数获取。

uint32-t- DHM-setalice( void) {

int flag-time(NULL);

srand(flag);

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

Return DHM-alice;

}

DHM-alpha也是要计算出来的,它是根据DH M-*lice计算出来的,如下:

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给远程主机并且接收DH M-beta并根据它来计算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同时做同样的工作,它们便能获取到公共的会话密钥当获取了公共密钥后,就可以调用加密算法进行文本加密了,下面是DH算法实现后的运行结果,双方协商生成的加密密钥为4:

在 client运行程序如下 :

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运行程序如下 :

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算法

上面已经实现了通过DH交换生成加密密钥,下面就需要实现加密算法,即Laesar算法的程序实现首先传输的都是宇符数据所以需要对宇符进行加密处理,将该字符转化成对应的Int类型,然后将该数字加上通过协商生成的key值,生成新加密的字符对应的数字.最后将该数字转化为字符,得到最终加密后的字符,实现数据的加密(原来的int数据加上key后,可能超过字符的最大取值,所以使用取模的方式,超过最大后重第一个字符算起)。

Caesar算法实现

//Caes ar加密算法.key为协商后生成的密钥

Char encrypt(char in,int key){

Char chin;

Int x}

X- static-east (in);

X= (x+key) %128;

Chin- static-east-(x);

RetLirn chin;

上面实现了加密的算法.解密的算法和加密的算法类似,只是解密是把获取的字符减去key值,然后还原出真实的数据信息。

三、数据实时加密实现

算法实现后还需要解决如何在数据实时传输时进行加密的问题,本次考虑了两种实时加密的实现方式,分别对这两种方法进行分析,选择合适的方式来实现数据传输时实时加密。

第一种方式就是先加密文件,再将已经加密的文件读取后封装到数据包,传输到对端,然后删除加密后的中间文件,还原到最初的状态这种处理方式需要先生成中间的加密文件,这样既消耗了磁盘的存储空间,存在大量的无用的中间文件,而且需要对硬盘进行频繁的读写,消耗I/O和C.PU处理最后还需要清理中间数据,增加了额外的处理不过该方式的优点是可以直接调用socket的send函数传输数据,因为传输的数据就已经是加过密的数据但是考虑到传输的数据可能非常大在过多的硬盘操作处理和加密中,对于效率影响非常大,故不采用该实现方式。

另外的一种加密方式是直接读取未加密的数据,在读取数据之后,封装为传输数据包之前,将该数据进行加密这种加密方式的优点是不需要对原始数据进行任何处理。加密时直接重发送缓冲区读取数据执行加密由于是内存操作,加密速度快,也不会生成冗余的文件加密完成后,在调用send函数将数据发送到对端对端接收到数据用,也先执行解密,然后在存放到本地,下面是具体的实现:

Bzero( buffer.BUFFER-SIZE):

//这里完成了将需要发送的数据读取到缓冲数组

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

//对发送数据进行加密

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

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

//客户端发送数据给服务器端

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

Perror("send")

}

//中断连接

Close( client-socket)i

Return O;

}

接收方在完成recv后,调用解密函数对于已经加密的数据进行解密,还原成原始的数据信息,实现在传输过程中的实时加密数据传输,实现的方式和加密方式类似。

小知识之信道

指通信的通道,是信号传输的媒介。