socket+dh+cr4實現(xiàn)文件傳輸加密要點
《socket+dh+cr4實現(xiàn)文件傳輸加密要點》由會員分享,可在線閱讀,更多相關(guān)《socket+dh+cr4實現(xiàn)文件傳輸加密要點(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、socket+dh+cr4實現(xiàn)文件傳輸加密
client.cpp
// client.cpp : Defines the entry point for the console application. //
#include
2、; 〃初始化的函數(shù) void Crypt(); unsigned int S[256]; // 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⑵ a=(a*a)%p; } else { b=b-1; c=(a*c)%p; } Run(a,b,p,c); void swap(char *s1,char *s2) { ch
3、ar temp; temp=*s1; *s1=*s2; *s2=temp; } void re_S(char *S) {. int i; for(i=0;i<256;i++) S[i]=i; } void re_T(char *T,char *key) {. int i; int keylen; keylen=strlen(key); for(i=0;i<256;i++) T[i]=key[i%keylen]; } void re_Sbox(char *S,char *T) {. int i; int j=0; for(i=0;i<256;i++)
4、 { j=(j+S[i]+T[i])%256; swap(&S[i],&S[j]); } } void RC4_1(FILE *readfile,FILE *writefile,char *key)// 力口密 { . char S[256]={0}; char readbuf[1]; int i,j,t; char T[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
5、]) % 256; swap(&S[i],&S[j]); t = (S[i] + (S[j] % 256)) % 256; readbuf[0]=readbuf[0]AS[t]; fwrite(readbuf,1,1,writefile); memset(readbuf,0,1); } } int main(int argc, char* argv口) { printf("—-客戶端:啟動--——\n"); int x=0; printf("----說明:由客戶端定義大素數(shù)和原根,客戶端加密文件后發(fā)給服務(wù)器 端,服務(wù)器短解密得到正確的消息----\n"); printf(
6、"\n"); printf("—發(fā)送大素數(shù)和原根給服務(wù)器端—\n"); nego(&x); char key[]=""; FILE *file1,*file2; char filePath1[50]; printf("\n"); printf("----開始文件傳輸----\n"); printf("請輸入要發(fā)送的文件路徑:”); scanf("%s",filePath1); printf("準(zhǔn)備加密文件,請輸入共享密鑰:"); scanf("%s”,&key); file1= fopen(filePath1,"r"); file2 = fopen("1.txt","
7、w"); RC4_1(file1,file2,key); fclose(filel); fclose(file2); printf("加密成功,準(zhǔn)備發(fā)送給服務(wù)器端"); WSADATA wsa; WSAStartup(MAKEWORD(2,2),&wsa); SOCKET sock=socket(AF_INET,SOCK_STREAM,0); if(sock==INVALID_SOCKET) { printf("socket error\n"); return 0; } SOCKADDR_IN local; char server[20]; //printf("請輸
8、入 IP 地址:"); 〃scanf("%s",server); memcpy(server,"127.0.0.1",sizeof("127.0.0.1")); char filePath[50]; strcpy(filePath, "1.txt"); HANDLE fp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING ,FILE_ATTRI BUTE_NORMAL,NULL); while(fp==INVALID_HANDLE_V ALUE) { printf("文件路徑錯誤,請重新輸入:”); scanf("%s
9、",filePath); fp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING ,FILE_ATTRI BUTE_NORMAL,NULL); } printf("%s\n",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=
10、htons(10000); if(connect(sock,(SOCKADDR*)&local,sizeof(SOCKADDR))==SOCKET_ERROR) { printf("connect error:%i\n",WSAGetLastError()); return 0; char* buffer=new char[fileLen]; DWORD bufferLen=0; //讀取文件到緩存中 ReadFile(fp,buffer,fileLen,&bufferLen,NULL); bool isFirst=true;//第一次發(fā)送 int sendLen=0;//實
11、際發(fā)送數(shù)據(jù)的長度 char sendBuffer[200];//發(fā)送幀 int sendedLen=0;//S前已發(fā)送的文件長度 int leftLen=fileLen;//當(dāng)前剩下的文件長度 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
12、))//剩下長度為 0 或當(dāng)前已發(fā)送長度 為文件長則退出 break; if(leftLen>=200) { memcpy(sendBuffer,buffer+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(sendL
13、en<0) { printf("幀發(fā)送失敗,程序結(jié)束\n"); return 0; } Sleep(1000); send(sock,"#",1,0); } sendedLen+=sendLen; leftLen=fileLen-sendedLen; printf("已經(jīng)發(fā)送:%d 字節(jié)\n",sendedLen); } if(sendedLen==fileLen) { printf("文件發(fā)送成功\n"); } else printf("文件發(fā)送失敗\n"); closesocket(sock); WSACleanup(); delete口 buffer
14、; return 0; } void nego(int *a) { int t=1; int Q; int A; int XA1=0; long int XA2=1; int XB1=0; long int k=1; int *k1; WORD wVersionRequested; WSADATA wsaData; int err; SOCKET sockClient; SOCKADDR_IN addrSrv; char recvBuf[50]; wVersionRequested = MAKEWORD( 1,1); err = WSAStartup(
15、wVersionRequested, &wsaData ); if ( err != 0 ) { printf("something error!"); } 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_IN
16、ET; addrSrv.sin_port=htons(2120); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); printf("請輸入?yún)f(xié)商的素數(shù):"); char su[10]; 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("--
17、--輸入自己的私鑰并計算出公鑰發(fā)給服務(wù)器端----\n"); printf("請輸入自己的私鑰:"); scanf("%d",&XA1); XA2=Run(A,XA1,Q,t); printf("發(fā)送自己的公鑰 %d給服務(wù)器端\n”,XA2); sprintf(su,"%d",XA2); send(sockClient,su,strlen(su)+1,0); printf("\n"); printf("----等待服務(wù)器端的公鑰----\n"); recv(sockClient,recvBuf,50,0); *a = atoi(recvBuf); printf("得到服務(wù)
18、器端公鑰:%d\n",*a);
k=Run(*a,XA1,Q,t);
printf("\n");
printf("----計算共享的秘密密鑰----\n");
printf("共享的秘密密鑰KEY為%~肝卜);
closesocket(sockClient);
WSACleanup();
}
server.cpp
// server.cpp : Defines the entry point for the console application.
//
#include 19、.h>
#include 20、
{.
int i;
int keylen;
keylen=strlen(key);
for(i=0;i<256;i++)
T[i]=key[i%keylen];
}
void re_Sbox(char *S,char *T)
{
int i;
int j=0;
for(i=0;i<256;i++)
{
j=(j+S[i]+T[i])%256;
swap(&S[i],&S[j]);
}
}
void RC4_1(FILE *readfile,FILE *writefile,char *key)// 力口密 { .
char S[256]={0};
cha 21、r readbuf[1];
int i,j,t;
char T[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]AS[t];
fwrite(readbuf,1,1,writefile); memset(readb 22、uf,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⑵
a=(a*a)%p;
} else
{
b=b-1;
c=(a*c)%p;
} Run(a,b,p,c);
} int main(int argc, char* argv口)
{
printf("—服務(wù)器端:啟動—\n");
int x=0,y=0,z=0;
printf("----說明:由客戶端定義大素數(shù)和原 23、根,客戶端加密文件后發(fā)給服務(wù)器 端,服務(wù)器短解密得到正確的消息----\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);
if(sock==INVALID_SOCKET)
{
printf("socket error\n"); return 0;
SOCKADDR_IN local;
local.sin_ 24、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());
return 0;
}
if(listen(sock,5)==SOCKET_ERROR) {
printf("%i\n",WSAGetLastError());
return 0;
}
printf("\n") 25、;
printf("----等待客戶端傳輸文件----\n");
SOCKADDR_IN client;
SOCKET clientSock;
int addrLen=sizeof(SOCKADDR);
clientSock=accept(sock,(SOCKADDR*)&client,&addrLen); printf("welcome:%s\n”,inet_ntoa(client.sin_addr));
int recvLen=0;//收至ij的緩沖的長度
int recvedLen=0;//當(dāng)前已經(jīng)收到的長度
DWORD writeLen;//實際寫入文件的長度
int 26、 fileLen=0;//文件長度
char* buffer;//文件緩沖
char recvBuffer[200];// 接收緩沖區(qū)
buffer=new char[1024*1024*10];//接收字節(jié)數(shù) <=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((r 27、ecvLen==1)&&(recvBuffer[0]==#))
break;
memcpy(buffer+recvedLen,recvBuffer,recvLen);
recvedLen+=recvLen;
printf("接收:%d\n",recvLen);
printf("已經(jīng)接收 %i 字節(jié)數(shù)據(jù) \n",recvedLen);
}
HANDLE
fp=CreateFile("1.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIB UTE_NORMAL,NULL);
WriteFile(fp,buffer,recvedLen 28、,&writeLen,NULL);
printf("寫入文件長度:%u\n",writeLen);
CloseHandle(fp);
delete口 buffer;
WSACleanup();
char key[]="";
printf("準(zhǔn)備解密文件:請輸入共享密鑰:”);
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);
29、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 wVersionRequested;
WSADATA wsaData;
int err;
SOCKET sockSrv;
SOCKADDR_IN addrSrv;
int len;
SOCKADDR_IN addrClient;
char recvBuf[50];
wV 30、ersionRequested = MAKEWORD( 1,1);
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("something error!");
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup();
}
sockSrv=socket(AF_INET,SOCK_STREAM,0);
addrSrv.sin_addr.S_un.S_addr 31、=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 sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char su[10];
recv(sockConn,recvBuf,50,0);
*a = 32、atoi(recvBuf);
printf("客戶端定義的大素數(shù):%d\n",*a);
recv(sockConn,recvBuf,50,0);
*b = atoi(recvBuf);
printf("客戶端定義的原根:%d\n",*b);
printf("\n");
printf("----等待客戶端的公鑰----\n");
recv(sockConn,recvBuf,50,0);
*c = atoi(recvBuf);
printf("客戶端的公鑰:%d\n",*c);
Q=*a;
A=*b;
XB1=*c;
printf("\n");
printf("---- 33、輸入自己的私鑰并計算出公鑰發(fā)給客戶端----\n");
printf("請輸入自己的私鑰:");
scanf("%d",&XA1);
XA2=Run(A,XA1,Q,t);
printf("發(fā)送自己的公鑰 %d給對方\n",XA2);
sprintf(su,"%d",XA2);
send(sockConn,su,strlen(su)+1,0);
k=Run(*c,XA1,Q,t);
printf("\n");
printf("----計算共享的秘密密鑰----\n");
printf("共享的秘密密鑰KEY為%~肝卜);
closesocket(sockConn);
b 34、reak;
2.cpp
#include 35、(a*c)%p;
}
Run(a,b,p,c);
}
int main(int argc, CHAR* argv[])
{
int t=1;
int Q=11351;
int A=5;
int XA1=0;
long int XA2=1;
int XB1=0;
int i;
long int k=1;
printf("請輸入自己的私鑰XA1:");
scanf("%d",&XA1);
XA2=Run(A,XA1,Q,t);
printf("自己的公鑰的公鑰XA2:%d",XA2);
printf("\n");
printf("請輸入對方的公鑰XB1:");
scanf("%d",&XB1);
k=Run(XB1,XA1,Q,t);
printf("KEY 為%~"卜); printf("\n");
}
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥事管理與法規(guī)楊世民第2版第一章
- 初中語法-形容詞和副詞
- 《公民的基本權(quán)利和義務(wù)》人教部編版道德與法治課件
- 五年級上冊音樂課件-豐收的節(jié)日(2)|人音版(簡譜)最新
- 企業(yè)家商業(yè)計劃培訓(xùn)教程75275
- 員工保密意識及技能教育培訓(xùn)課件
- [精選]CAINA肖爾布拉克營銷戰(zhàn)略規(guī)劃(PPT 174頁)5799
- 教育專題:18___跨越百年的美麗
- 北魏孝文帝的改革措施
- 教育專題:兒童防拐教案1
- 數(shù)據(jù)隔離級別
- 最新2018清新簡約工作匯報模板【ppt精美模板】
- 電子工藝第5章(精品)
- [精選]中化公司銷售培訓(xùn)77824
- (連云港專版)中考?xì)v史復(fù)習(xí) 第2單元 中國近代史 第9課時 抗日戰(zhàn)爭和人民解放戰(zhàn)爭的勝利課件 北師大版