socket+dh+cr4实现文件传输加密.docx

上传人:b****3 文档编号:5390312 上传时间:2023-05-08 格式:DOCX 页数:23 大小:19.44KB
下载 相关 举报
socket+dh+cr4实现文件传输加密.docx_第1页
第1页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第2页
第2页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第3页
第3页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第4页
第4页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第5页
第5页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第6页
第6页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第7页
第7页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第8页
第8页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第9页
第9页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第10页
第10页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第11页
第11页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第12页
第12页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第13页
第13页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第14页
第14页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第15页
第15页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第16页
第16页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第17页
第17页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第18页
第18页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第19页
第19页 / 共23页
socket+dh+cr4实现文件传输加密.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

socket+dh+cr4实现文件传输加密.docx

《socket+dh+cr4实现文件传输加密.docx》由会员分享,可在线阅读,更多相关《socket+dh+cr4实现文件传输加密.docx(23页珍藏版)》请在冰点文库上搜索。

socket+dh+cr4实现文件传输加密.docx

socket+dh+cr4实现文件传输加密

socket+dh+cr4实现文件传输加密

client.cpp

//client.cpp:

Definestheentrypointfortheconsoleapplication.

//

#include

#include

#include

#include

//你用了winsock但没有链接相应的lib文件。

加上这一句:

#pragmacomment(lib,"ws2_32.lib")

#defineFNAME30

voidInitial(char*);//初始化的函数

voidCrypt();

unsignedintS[256];//S数组

voidnego(int*a);//初始化的函数

intRun(intx,intr,intp,intt)

{inta,b,c;

a=x;b=r;c=t;

if(b==0)

{

returnc;

}

if((b>0)&&(b%2==0))

{

b=b/2;

a=(a*a)%p;

}

else

{

b=b-1;

c=(a*c)%p;

}

Run(a,b,p,c);

}

 

voidswap(char*s1,char*s2)

{

chartemp;

temp=*s1;

*s1=*s2;

*s2=temp;

}

voidre_S(char*S)

{

inti;

for(i=0;i<256;i++)

S[i]=i;

}

voidre_T(char*T,char*key)

{

inti;

intkeylen;

keylen=strlen(key);

for(i=0;i<256;i++)

T[i]=key[i%keylen];

}

voidre_Sbox(char*S,char*T)

{

inti;

intj=0;

for(i=0;i<256;i++)

{

j=(j+S[i]+T[i])%256;

swap(&S[i],&S[j]);

}

}

 

voidRC4_1(FILE*readfile,FILE*writefile,char*key)//加密

{

charS[256]={0};

charreadbuf[1];

inti,j,t;

charT[256]={0};

re_S(S);

re_T(T,key);

re_Sbox(S,T);

i=j=0;

while(fread(readbuf,1,1,readfile))

{

i=(i+1)%256;

j=(j+S[i])%256;

swap(&S[i],&S[j]);

t=(S[i]+(S[j]%256))%256;

readbuf[0]=readbuf[0]^S[t];

fwrite(readbuf,1,1,writefile);

memset(readbuf,0,1);

}

}

 

intmain(intargc,char*argv[])

{

printf("----客户端:

启动-----\n");

intx=0;

printf("----说明:

由客户端定义大素数和原根,客户端加密文件后发给服务器端,服务器短解密得到正确的消息----\n");

printf("\n");

printf("----发送大素数和原根给服务器端----\n");

nego(&x);

 

charkey[]="";

FILE*file1,*file2;

charfilePath1[50];

printf("\n");

printf("----开始文件传输----\n");

printf("请输入要发送的文件路径:

");

scanf("%s",filePath1);

printf("准备加密文件,请输入共享密钥:

");

scanf("%s",&key);

file1=fopen(filePath1,"r");

file2=fopen("1.txt","w");

RC4_1(file1,file2,key);

fclose(file1);

fclose(file2);

printf("加密成功,准备发送给服务器端");

 

WSADATAwsa;

WSAStartup(MAKEWORD(2,2),&wsa);

SOCKETsock=socket(AF_INET,SOCK_STREAM,0);

if(sock==INVALID_SOCKET)

{

printf("socketerror\n");

return0;

}

SOCKADDR_INlocal;

charserver[20];

//printf("请输入IP地址:

");

//scanf("%s",server);

memcpy(server,"127.0.0.1",sizeof("127.0.0.1"));

charfilePath[50];

strcpy(filePath,"1.txt");

HANDLEfp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

while(fp==INVALID_HANDLE_VALUE)

{

printf("文件路径错误,请重新输入:

");

scanf("%s",filePath);

fp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

}

printf("%s\n",filePath);

DWORDfileLen=GetFileSize(fp,&fileLen);

printf("你选择的文件大小为:

%u字节\n",fileLen);

 

local.sin_addr.S_un.S_addr=inet_addr(server);

local.sin_family=AF_INET;

local.sin_port=htons(10000);

if(connect(sock,(SOCKADDR*)&local,sizeof(SOCKADDR))==SOCKET_ERROR)

{

printf("connecterror:

%i\n",WSAGetLastError());

return0;

}

char*buffer=newchar[fileLen];

DWORDbufferLen=0;

//读取文件到缓存中

ReadFile(fp,buffer,fileLen,&bufferLen,NULL);

boolisFirst=true;//第一次发送

intsendLen=0;//实际发送数据的长度

charsendBuffer[200];//发送帧

intsendedLen=0;//当前已发送的文件长度

intleftLen=fileLen;//当前剩下的文件长度

while(true)

{

if(isFirst)

{

sendLen=send(sock,"~",1,0);

isFirst=false;

if(sendLen<0)

{

printf("第一帧发送失败,程序结束\n");

return0;

}

Sleep(1000);

continue;

}

if((leftLen<=0)||(sendedLen>=fileLen))//剩下长度为0或当前已发送长度为文件长则退出

break;

 

if(leftLen>=200)

{

memcpy(sendBuffer,buffer+sendedLen,200);

sendLen=send(sock,sendBuffer,200,0);

if(sendLen<0)

{

printf("帧发送失败,程序结束\n");

return0;

}

}

else

{

memcpy(sendBuffer,buffer+sendedLen,leftLen);

sendLen=send(sock,sendBuffer,leftLen,0);

if(sendLen<0)

{

printf("帧发送失败,程序结束\n");

return0;

}

Sleep(1000);

send(sock,"#",1,0);

}

sendedLen+=sendLen;

leftLen=fileLen-sendedLen;

printf("已经发送:

%d字节\n",sendedLen);

}

if(sendedLen==fileLen)

{

printf("文件发送成功\n");

}

else

printf("文件发送失败\n");

closesocket(sock);

WSACleanup();

delete[]buffer;

 

return0;

}

voidnego(int*a)

{

intt=1;

intQ;

intA;

intXA1=0;

longintXA2=1;

intXB1=0;

longintk=1;

int*k1;

WORDwVersionRequested;

WSADATAwsaData;

interr;

SOCKETsockClient;

SOCKADDR_INaddrSrv;

charrecvBuf[50];

wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!

=0){

printf("somethingerror!

");

}

if(LOBYTE(wsaData.wVersion)!

=1||

HIBYTE(wsaData.wVersion)!

=1){

WSACleanup();

}

sockClient=socket(AF_INET,SOCK_STREAM,0);

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(2120);

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

printf("请输入协商的素数:

");

charsu[10];

gets(su);

send(sockClient,su,strlen(su)+1,0);

Q=atoi(su);

printf("请输入协商的原根:

");

gets(su);

send(sockClient,su,strlen(su)+1,0);

A=atoi(su);

printf("\n");

printf("----输入自己的私钥并计算出公钥发给服务器端----\n");

printf("请输入自己的私钥:

");

scanf("%d",&XA1);

XA2=Run(A,XA1,Q,t);

printf("发送自己的公钥%d给服务器端\n",XA2);

sprintf(su,"%d",XA2);

send(sockClient,su,strlen(su)+1,0);

printf("\n");

printf("----等待服务器端的公钥----\n");

recv(sockClient,recvBuf,50,0);

*a=atoi(recvBuf);

printf("得到服务器端公钥:

%d\n",*a);

k=Run(*a,XA1,Q,t);

printf("\n");

printf("----计算共享的秘密密钥----\n");

printf("共享的秘密密钥KEY为%d\n",k);

closesocket(sockClient);

WSACleanup();

}

 

server.cpp

//server.cpp:

Definestheentrypointfortheconsoleapplication.

//

#include

#include

#include

#include

#include

#pragmacomment(lib,"ws2_32.lib")

voidnego(int*a,int*b,int*c);//初始化的函数

voidswap(char*s1,char*s2)

{

chartemp;

temp=*s1;

*s1=*s2;

*s2=temp;

}

voidre_S(char*S)

{

inti;

for(i=0;i<256;i++)

S[i]=i;

}

voidre_T(char*T,char*key)

{

inti;

intkeylen;

keylen=strlen(key);

for(i=0;i<256;i++)

T[i]=key[i%keylen];

}

voidre_Sbox(char*S,char*T)

{

inti;

intj=0;

for(i=0;i<256;i++)

{

j=(j+S[i]+T[i])%256;

swap(&S[i],&S[j]);

}

}

 

voidRC4_1(FILE*readfile,FILE*writefile,char*key)//加密

{

charS[256]={0};

charreadbuf[1];

inti,j,t;

charT[256]={0};

re_S(S);

re_T(T,key);

re_Sbox(S,T);

i=j=0;

while(fread(readbuf,1,1,readfile))

{

i=(i+1)%256;

j=(j+S[i])%256;

swap(&S[i],&S[j]);

t=(S[i]+(S[j]%256))%256;

readbuf[0]=readbuf[0]^S[t];

fwrite(readbuf,1,1,writefile);

memset(readbuf,0,1);

}

}

intRun(intx,intr,intp,intt)

{inta,b,c;

a=x;b=r;c=t;

if(b==0)

{

returnc;

}

if((b>0)&&(b%2==0))

{

b=b/2;

a=(a*a)%p;

}

else

{

b=b-1;

c=(a*c)%p;

}

Run(a,b,p,c);

}

 

intmain(intargc,char*argv[])

{

printf("----服务器端:

启动----\n");

intx=0,y=0,z=0;

printf("----说明:

由客户端定义大素数和原根,客户端加密文件后发给服务器端,服务器短解密得到正确的消息----\n");

printf("\n");

printf("----等待客户端客户端定义大素数和原根----\n");

nego(&x,&y,&z);

WSADATAwsa;

WSAStartup(MAKEWORD(2,2),&wsa);

SOCKETsock=socket(AF_INET,SOCK_STREAM,0);

if(sock==INVALID_SOCKET)

{

printf("socketerror\n");

return0;

}

SOCKADDR_INlocal;

local.sin_addr.S_un.S_addr=INADDR_ANY;

local.sin_family=AF_INET;

local.sin_port=htons(10000);

 

if(bind(sock,(SOCKADDR*)&local,sizeof(SOCKADDR))==SOCKET_ERROR)

{

printf("%i\n",WSAGetLastError());

return0;

}

 

if(listen(sock,5)==SOCKET_ERROR)

{

printf("%i\n",WSAGetLastError());

return0;

}

printf("\n");

printf("----等待客户端传输文件----\n");

SOCKADDR_INclient;

SOCKETclientSock;

intaddrLen=sizeof(SOCKADDR);

clientSock=accept(sock,(SOCKADDR*)&client,&addrLen);

printf("welcome:

%s\n",inet_ntoa(client.sin_addr));

intrecvLen=0;//收到的缓冲的长度

intrecvedLen=0;//当前已经收到的长度

DWORDwriteLen;//实际写入文件的长度

intfileLen=0;//文件长度

char*buffer;//文件缓冲

charrecvBuffer[200];//接收缓冲区

buffer=newchar[1024*1024*10];//接收字节数<=10M

recvLen=recv(clientSock,recvBuffer,200,0);

if(recvBuffer[0]=='~')

{

printf("开始接收文件\n");

memset(recvBuffer,0,200);

}

 

while(true)

{

recvLen=recv(clientSock,recvBuffer,200,0);

if((recvLen==1)&&(recvBuffer[0]=='#'))

break;

memcpy(buffer+recvedLen,recvBuffer,recvLen);

recvedLen+=recvLen;

printf("接收:

%d\n",recvLen);

printf("已经接收%i字节数据\n",recvedLen);

}

 

HANDLEfp=CreateFile("1.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

WriteFile(fp,buffer,recvedLen,&writeLen,NULL);

printf("写入文件长度:

%u\n",writeLen);

CloseHandle(fp);

delete[]buffer;

WSACleanup();

 

charkey[]="";

printf("准备解密文件:

请输入共享密钥:

");

scanf("%s",&key);

FILE*file1,*file2;

file1=fopen("1.txt","r");

file2=fopen("2.txt","w");

RC4_1(file1,file2,key);

fclose(file1);

fclose(file2);

printf("解密成功,保存在server文件夹2.txt中");

}

voidnego(int*a,int*b,int*c)

{

intt=1;

intQ;

intA;

intXA1=0;

longintXA2=1;

intXB1=0;

longintk=1;

 

WORDwVersionRequested;

WSADATAwsaData;

interr;

SOCKETsockSrv;

SOCKADDR_INaddrSrv;

intlen;

SOCKADDR_INaddrClient;

charrecvBuf[50];

wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!

=0){

printf("somethingerror!

");

}

if(LOBYTE(wsaData.wVersion)!

=1||

HIBYTE(wsaData.wVersion)!

=1){

WSACleanup();

}

sockSrv=socket(AF_INET,SOCK_STREAM,0);

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(2120);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

len=sizeof(SOCKADDR);

while

(1)

{

SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

charsu[10];

recv(sockConn,recvBuf,50,0);

*a=atoi(recvBuf);

printf("客户端定义的大素数:

%d\n",*a);

recv(sockConn,recvBuf,50,0);

*b=atoi(recvBuf);

printf("客户端定义的原根:

%d\n",*b);

printf("\n");

printf("----等待客户端的公钥----

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2