socket+dh+cr4實現(xiàn)文件傳輸加密_第1頁
socket+dh+cr4實現(xiàn)文件傳輸加密_第2頁
socket+dh+cr4實現(xiàn)文件傳輸加密_第3頁
socket+dh+cr4實現(xiàn)文件傳輸加密_第4頁
socket+dh+cr4實現(xiàn)文件傳輸加密_第5頁
免費預覽已結(jié)束,剩余10頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、socket+dh+cr4 實現(xiàn)文件傳輸加密client.cpp/ client.cpp : Defines the entry point for the console application. /#include <stdio.h>#include <Winsock2.h>#include<stdlib.h>#include<string.h>/你用了winsock 但沒有鏈接相應的lib 文件。加上這一句:#pragma comment(lib, "ws2_32.lib ")#define FNAME 30void I

2、nitial(char *);/初始化的函數(shù)void Crypt();unsigned int S256;/ S 數(shù)組void nego(int *a) ;/初始化的函數(shù)int Run(int x,int r,int p,int t) int a,b,c;a=x;b=r;c=t;if(b=0) return c;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);void swap(char *s1,char *s2)char temp;temp=*s1;*s1=*s2;*s2=temp;

3、void re_S(char *S)int i;for(i=0;i<256;i+)Si=i;void re_T(char *T,char *key)int i;int keylen;keylen=strlen(key);for(i=0;i<256;i+)Ti=keyi%keylen;void re_Sbox(char *S,char *T)int i;int j=0;for(i=0;i<256;i+)j=(j+Si+Ti)%256;swap(&Si,&Sj); void RC4_1(FILE *readfile,FILE *writefile,char *ke

4、y)/ 加密 char S256=0;char readbuf1;int i,j,t;char T256=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 + Si) % 256;swap(&Si,&Sj);t = (Si + (Sj % 256) % 256;readbuf0=readbuf0ASt;fwrite(readbuf,1,1,writefile);memset(readbuf,0,1); int main(int a

5、rgc, char* argv)printf(" 客戶端:啟動n");int x=0;printf(" 說明 :由客戶端定義大素數(shù)和原根,客戶端加密文件后發(fā)給服務器端,服務器短解密得到正確的消息n");printf("n");printf(" 發(fā)送大素數(shù)和原根給服務器端n");nego(&x);char key=""FILE *file1,*file2;char filePath150;printf("n");printf(" 開始文件傳輸n");

6、printf(" 請輸入要發(fā)送的文件路徑:");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(" 加密成功,準備發(fā)送給服務器端&q

7、uot;);WSADATA wsa;WSAStartup(MAKEWORD(2,2),&wsa);SOCKET sock=socket(AF_INET,SOCK_STREAM,0); if(sock=INVALID_SOCKET)printf("socket errorn");return 0;SOCKADDR_IN local;char server20;/printf(" 請輸入 IP 地址 :");/scanf("%s",server);memcpy(server,"127.0.0.1",sizeof

8、("127.0.0.1");char filePath50;strcpy(filePath, "1.txt");HANDLEfp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING ,FILE_ATTRI BUTE_NORMAL,NULL);while(fp=INV ALID_HANDLE_V ALUE) printf("文件路徑錯誤,請重新輸入:”);scanf("%s",filePath);fp=CreateFile(filePath,GENERIC_READ,0,

9、NULL,OPEN_EXISTING ,FILE_ATTRI BUTE_NORMAL,NULL);printf("%sn",filePath);DWORD fileLen=GetFileSize(fp,&fileLen);printf(" 你選擇的文件大小為:%u 字節(jié) 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*)&am

10、p;local,sizeof(SOCKADDR)=SOCKET_ERROR) printf("connect error:%in",WSAGetLastError();return 0;char* buffer=new charfileLen;DWORD bufferLen=0;/讀取文件到緩存中ReadFile(fp,buffer,fileLen,&bufferLen,NULL);bool isFirst=true;/第一次發(fā)送int sendLen=0;/實際發(fā)送數(shù)據(jù)的長度char sendBuffer200;/發(fā)送幀int sendedLen=0;/S前已發(fā)送

11、的文件長度int leftLen=fileLen;/ 當前剩下的文件長度while(true)if(isFirst)sendLen=send(sock,"",1,0);isFirst=false;if(sendLen<0)printf(" 第一幀發(fā)送失敗,程序結(jié)束n");return 0;Sleep(1000);continue;if(leftLen<=0)|(sendedLen>=fileLen)/剩下長度為 0 或當前已發(fā)送長度 為文件長則退出break;if(leftLen>=200)memcpy(sendBuffer,bu

12、ffer+sendedLen,200);sendLen=send(sock,sendBuffer,200,0);if(sendLen<0)printf(" 幀發(fā)送失敗,程序結(jié)束n");return 0;else memcpy(sendBuffer,buffer+sendedLen,leftLen); sendLen=send(sock,sendBuffer,leftLen,0);if(sendLen<0)printf(" 幀發(fā)送失敗,程序結(jié)束n");return 0;Sleep(1000);send(sock,"#",1,

13、0);sendedLen+=sendLen;leftLen=fileLen-sendedLen;printf(" 已經(jīng)發(fā)送:%d 字節(jié) n",sendedLen);if(sendedLen=fileLen)printf(" 文件發(fā)送成功n"); elseprintf(" 文件發(fā)送失敗n");closesocket(sock);WSACleanup();delete buffer;return 0;void nego(int *a)int t=1;int Q;int A;int XA1=0;long int XA2=1;int XB1=

14、0;long int k=1;int *k1;WORD wVersionRequested;WSADATA wsaData;int err;SOCKET sockClient;SOCKADDR_IN addrSrv;char recvBuf50;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) printf("something error!");if ( LOBYTE( wsaData.wVersion ) !=

15、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(" 請輸入?yún)f(xié)商的素數(shù):")

16、;char su10;gets(su);send(sockClient,su,strlen(su)+1,0);Q=atoi(su);printf(" 請輸入?yún)f(xié)商的原根:");gets(su);send(sockClient,su,strlen(su)+1,0);A=atoi(su);printf("n");printf(" 輸入自己的私鑰并計算出公鑰發(fā)給服務器端n");printf(" 請輸入自己的私鑰:");scanf("%d",&XA1);XA2=Run(A,XA1,Q,t);pri

17、ntf(" 發(fā)送自己的公鑰%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(" 得到服務器端公鑰:%dn",*a);k=Run(*a,XA1,Q,t);printf("n");printf(" 計

18、算共享的秘密密鑰n");printf(" 共享的秘密密鑰KEY 為 %dn",k);closesocket(sockClient);WSACleanup();server.cpp/ server.cpp : Defines the entry point for the console application./#include <stdio.h>#include <winsock2.h>#include <string.h>#include <windows.h>#include <stdlib.h>#

19、pragma comment(lib, "ws2_32.lib ")void nego(int *a,int *b,int *c) ;/初始化的函數(shù)void swap(char *s1,char *s2)char temp;temp=*s1;*s1=*s2;*s2=temp;void re_S(char *S)int i;for(i=0;i<256;i+)Si=i;void re_T(char *T,char *key)int i;int keylen;keylen=strlen(key);for(i=0;i<256;i+)Ti=keyi%keylen;void

20、 re_Sbox(char *S,char *T)int i;int j=0;for(i=0;i<256;i+)j=(j+Si+Ti)%256;swap(&Si,&Sj);void RC4_1(FILE *readfile,FILE *writefile,char *key)/ 加密 char S256=0;char readbuf1;int i,j,t;char T256=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 +

21、 Si) % 256;swap(&Si,&Sj);t = (Si + (Sj % 256) % 256;readbuf0=readbuf0ASt;fwrite(readbuf,1,1,writefile);memset(readbuf,0,1);int Run(int x,int r,int p,int t) int a,b,c;a=x;b=r;c=t;if(b=0)return c;if(b>0)&&(b%2=0)b=b/2;a=(a*a)%p;elseb=b-1;c=(a*c)%p;Run(a,b,p,c);int main(int argc, cha

22、r* argv)printf(" 服務器端:啟動n");int x=0,y=0,z=0;printf(" 說明 :由客戶端定義大素數(shù)和原根,客戶端加密文件后發(fā)給服務器端,服務器短解密得到正確的消息n");printf("n");printf(" 等待客戶端客戶端定義大素數(shù)和原根n");nego(&x,&y,&z);WSADATA wsa;WSAStartup(MAKEWORD(2,2),&wsa);SOCKET sock=socket(AF_INET,SOCK_STREAM,0);i

23、f(sock=INVALID_SOCKET)printf("socket errorn");return 0;SOCKADDR_IN local;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("%in",WSAGetLastError();return 0; if(listen

24、(sock,5)=SOCKET_ERROR)printf("%in",WSAGetLastError();return 0;printf("n");printf(" 等待客戶端傳輸文件n");SOCKADDR_IN client;SOCKET clientSock;int addrLen=sizeof(SOCKADDR);clientSock=accept(sock,(SOCKADDR*)&client,&addrLen); printf("welcome:%sn",inet_ntoa(client

25、.sin_addr);int recvLen=0;/收至ij的緩沖的長度int recvedLen=0;/當前已經(jīng)收到的長度DWORD writeLen;/實際寫入文件的長度int fileLen=0;/文件長度char* buffer;/文件緩沖char recvBuffer200;/ 接收緩沖區(qū)buffer=new char1024*1024*10;/接收字節(jié)數(shù) <=10MrecvLen=recv(clientSock,recvBuffer,200,0);if(recvBuffer0='')printf(" 開始接收文件n");memset(rec

26、vBuffer,0,200);while(true)recvLen=recv(clientSock,recvBuffer,200,0);if(recvLen=1)&&(recvBuffer0='#')break;memcpy(buffer+recvedLen,recvBuffer,recvLen);recvedLen+=recvLen;printf(" 接收: %dn",recvLen);printf(" 已經(jīng)接收%i 字節(jié)數(shù)據(jù)n",recvedLen);HANDLEfp=CreateFile("1.txt&qu

27、ot;,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIB UTE_NORMAL,NULL);WriteFile(fp,buffer,recvedLen,&writeLen,NULL);printf(" 寫入文件長度:%un",writeLen);CloseHandle(fp);delete buffer;WSACleanup();char key=""printf(" 準備解密文件:請輸入共享密鑰:");scanf("%s",&key);FILE *file1

28、,*file2;file1= fopen("1.txt","r");file2 = fopen("2.txt","w");RC4_1(file1,file2,key);fclose(file1);fclose(file2);printf("解密成功,保存在server文件夾2.txt中) void nego(int *a,int *b,int *c)int t=1;int Q;int A;int XA1=0;long int XA2=1;int XB1=0;long int k=1;WORD wVersi

29、onRequested;WSADATA wsaData;int err;SOCKET sockSrv;SOCKADDR_IN addrSrv;int len;SOCKADDR_IN addrClient;char recvBuf50;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) printf("something error!");if ( LOBYTE( wsaData.wVersion ) != 1 |HIB

30、YTE( 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)SOCKET sockCon

31、n=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char su10;recv(sockConn,recvBuf,50,0);*a = atoi(recvBuf);printf(" 客戶端定義的大素數(shù):%dn",*a);recv(sockConn,recvBuf,50,0);*b = atoi(recvBuf);printf(" 客戶端定義的原根:%dn",*b);printf("n");printf(" 等待客戶端的公鑰n");recv(sockConn,recvBuf,50,0);*c = atoi(recvBuf);printf(" 客戶端的公鑰:%dn",*c);Q=*a;A=*b;XB1=*c;printf("n");printf(" 輸入自己的私鑰并計

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論