socket+dh+cr4实现文件传输加密Word格式.docx
- 文档编号:20234653
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:20
- 大小:19.50KB
socket+dh+cr4实现文件传输加密Word格式.docx
《socket+dh+cr4实现文件传输加密Word格式.docx》由会员分享,可在线阅读,更多相关《socket+dh+cr4实现文件传输加密Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
&
(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)
intkeylen;
keylen=strlen(key);
T[i]=key[i%keylen];
voidre_Sbox(char*S,char*T)
intj=0;
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;
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;
----说明:
由客户端定义大素数和原根,客户端加密文件后发给服务器端,服务器短解密得到正确的消息----\n"
\n"
----发送大素数和原根给服务器端----\n"
nego(&
x);
charkey[]="
"
;
FILE*file1,*file2;
charfilePath1[50];
printf("
----开始文件传输----\n"
请输入要发送的文件路径:
scanf("
%s"
filePath1);
准备加密文件,请输入共享密钥:
&
key);
file1=fopen(filePath1,"
r"
file2=fopen("
1.txt"
"
w"
RC4_1(file1,file2,key);
fclose(file1);
fclose(file2);
加密成功,准备发送给服务器端"
WSADATAwsa;
WSAStartup(MAKEWORD(2,2),&
wsa);
SOCKETsock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
{
socketerror\n"
return0;
SOCKADDR_INlocal;
charserver[20];
//printf("
请输入IP地址:
//scanf("
server);
memcpy(server,"
127.0.0.1"
sizeof("
));
charfilePath[50];
strcpy(filePath,"
HANDLEfp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
while(fp==INVALID_HANDLE_VALUE)
文件路径错误,请重新输入:
scanf("
filePath);
fp=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
%s\n"
DWORDfileLen=GetFileSize(fp,&
fileLen);
你选择的文件大小为:
%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)
connecterror:
%i\n"
WSAGetLastError());
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)
第一帧发送失败,程序结束\n"
Sleep(1000);
continue;
if((leftLen<
=0)||(sendedLen>
=fileLen))//剩下长度为0或当前已发送长度为文件长则退出
break;
if(leftLen>
=200)
memcpy(sendBuffer,buffer+sendedLen,200);
sendLen=send(sock,sendBuffer,200,0);
帧发送失败,程序结束\n"
else
memcpy(sendBuffer,buffer+sendedLen,leftLen);
sendLen=send(sock,sendBuffer,leftLen,0);
send(sock,"
#"
sendedLen+=sendLen;
leftLen=fileLen-sendedLen;
已经发送:
%d字节\n"
sendedLen);
if(sendedLen==fileLen)
文件发送成功\n"
文件发送失败\n"
closesocket(sock);
WSACleanup();
delete[]buffer;
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){
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("
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(2120);
connect(sockClient,(SOCKADDR*)&
addrSrv,sizeof(SOCKADDR));
请输入协商的素数:
charsu[10];
gets(su);
send(sockClient,su,strlen(su)+1,0);
Q=atoi(su);
请输入协商的原根:
A=atoi(su);
----输入自己的私钥并计算出公钥发给服务器端----\n"
请输入自己的私钥:
%d"
XA1);
XA2=Run(A,XA1,Q,t);
发送自己的公钥%d给服务器端\n"
XA2);
sprintf(su,"
----等待服务器端的公钥----\n"
recv(sockClient,recvBuf,50,0);
*a=atoi(recvBuf);
得到服务器端公钥:
%d\n"
*a);
k=Run(*a,XA1,Q,t);
----计算共享的秘密密钥----\n"
共享的秘密密钥KEY为%d\n"
k);
closesocket(sockClient);
server.cpp
//server.cpp:
winsock2.h>
windows.h>
voidnego(int*a,int*b,int*c);
----服务器端:
启动----\n"
intx=0,y=0,z=0;
----等待客户端客户端定义大素数和原根----\n"
x,&
y,&
z);
local.sin_addr.S_un.S_addr=INADDR_ANY;
if(bind(sock,(SOCKADDR*)&
if(listen(sock,5)==SOCKET_ERROR)
----等待客户端传输文件----\n"
SOCKADDR_INclient;
SOCKETclientSock;
intaddrLen=sizeof(SOCKADDR);
clientSock=accept(sock,(SOCKADDR*)&
client,&
addrLen);
welcome:
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]=='
~'
开始接收文件\n"
memset(recvBuffer,0,200);
if((recvLen==1)&
(recvBuffer[0]=='
#'
))
memcpy(buffer+recvedLen,recvBuffer,recvLen);
recvedLen+=recvLen;
接收:
recvLen);
已经接收%i字节数据\n"
recvedLen);
HANDLEfp=CreateFile("
GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(fp,buffer,recvedLen,&
writeLen,NULL);
写入文件长度:
%u\n"
writeLen);
CloseHandle(fp);
准备解密文件:
请输入共享密钥:
file1=fopen("
2.txt"
解密成功,保存在server文件夹2.txt中"
voidnego(int*a,int*b,int*c)
SOCKETsockSrv;
intlen;
SOCKADDR_INaddrClient;
sockSrv=socket(AF_INET,SOCK_STREAM,0);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
bind(sockSrv,(SOCKADDR*)&
listen(sockSrv,5);
len=sizeof(SOCKADDR);
while
(1)
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&
addrClient,&
len);
recv(sockConn,recvBuf,50,0);
*a=atoi(recvBuf);
printf("
客户端定义的大素数:
recv(sockConn,recvBuf,50,0);
*b=atoi(recvBuf);
客户端定义的原根:
*b);
----等待客户端的公钥----
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- socket dh cr4 实现 文件传输 加密
![提示](https://static.bdocx.com/images/bang_tan.gif)