




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、socket+dh+cr4 實現文件傳輸加密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 *);/初始化的函數void Crypt();unsigned int S256;/ S 數組void nego(int *a) ;/初始化的函數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(" 說明 :由客戶端定義大素數和原根,客戶端加密文件后發給服務器端,服務器短解密得到正確的消息n");printf("n");printf(" 發送大素數和原根給服務器端n");nego(&x);char key=""FILE *file1,*file2;char filePath150;printf("n");printf(" 開始文件傳輸n");
6、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(" 加密成功,準備發送給服務器端&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 字節 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;/第一次發送int sendLen=0;/實際發送數據的長度char sendBuffer200;/發送幀int sendedLen=0;/S前已發送
11、的文件長度int leftLen=fileLen;/ 當前剩下的文件長度while(true)if(isFirst)sendLen=send(sock,"",1,0);isFirst=false;if(sendLen<0)printf(" 第一幀發送失敗,程序結束n");return 0;Sleep(1000);continue;if(leftLen<=0)|(sendedLen>=fileLen)/剩下長度為 0 或當前已發送長度 為文件長則退出break;if(leftLen>=200)memcpy(sendBuffer,bu
12、ffer+sendedLen,200);sendLen=send(sock,sendBuffer,200,0);if(sendLen<0)printf(" 幀發送失敗,程序結束n");return 0;else memcpy(sendBuffer,buffer+sendedLen,leftLen); sendLen=send(sock,sendBuffer,leftLen,0);if(sendLen<0)printf(" 幀發送失敗,程序結束n");return 0;Sleep(1000);send(sock,"#",1,
13、0);sendedLen+=sendLen;leftLen=fileLen-sendedLen;printf(" 已經發送:%d 字節 n",sendedLen);if(sendedLen=fileLen)printf(" 文件發送成功n"); elseprintf(" 文件發送失敗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(" 請輸入協商的素數:")
16、;char su10;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);pri
17、ntf(" 發送自己的公鑰%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) ;/初始化的函數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(" 說明 :由客戶端定義大素數和原根,客戶端加密文件后發給服務器端,服務器短解密得到正確的消息n");printf("n");printf(" 等待客戶端客戶端定義大素數和原根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;/當前已經收到的長度DWORD writeLen;/實際寫入文件的長度int fileLen=0;/文件長度char* buffer;/文件緩沖char recvBuffer200;/ 接收緩沖區buffer=new char1024*1024*10;/接收字節數 <=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(" 已經接收%i 字節數據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(" 客戶端定義的大素數:%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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025集體土地租賃合同法
- 各類軟件測試技術考試題型及答案詳解
- 深入研究計算機考試試題及答案的圈子
- 青年創新創業的動力機制與激勵政策
- -棉纖維長度照影儀校準規范 試驗報告
- 社區戒煙門診建設的策略及實施路徑
- 新能源汽車制造行業新能源汽車電池回收利用市場拓展與風險控制報告
- 風險投資公司運營管理方案
- 2025年廢舊電子產品無害化處理與資源回收行業人才需求研究報告
- 養生素食快捷早餐行業深度調研及發展項目商業計劃書
- 中醫理療合同范本
- 小學經典誦讀社團活動計劃、安排、記錄
- 中職高教版(2023)語文基礎模塊下冊-第五單元寫作-說明的關鍵在于說得“明”【課件】
- 手機售后培訓方案
- 2025年度全國大學生創新創業競賽項目保密承諾書3篇
- DB33T 2288-2020 淡水池塘養殖尾水處理技術規范
- GB/T 44880-2024因果矩陣
- 安保工作的多元化發展
- 【MOOC】人格與精神障礙-學做自己的心理醫生-暨南大學 中國大學慕課MOOC答案
- 新能源汽車電氣系統檢修(微課版) 課件 項目二任務2無鑰匙進入和起動系統
- 生成式人工智能講解
評論
0/150
提交評論