📄 stmain.cpp
字号:
#include<openssl\bio.h>
#include"stmain.h"
#pragma comment (lib,"libeay32.lib")
#pragma comment (lib,"ssleay32.lib")
#define BUFFSIZE 256
int main( )
{
int select,sock,ret,len,i,bits=128;
char spasswd[255],encpyted_buff[BUFFSIZE],netaddr[255],buff[BUFFSIZE],
local_key_md5[BUFFSIZE/16],client_key_md5[BUFFSIZE/16],fn_out[255],fn_in[255],ip[255];
BIO *n_key,*f,*f2;
unsigned char passwd[BUFFSIZE/4];
//char *p,*q;
// AES_KEY mkey;
////////// welcome infomation and mode select /////////////////////////////////
printf("Welcome to use the Safe file transfer v.beta\n");
printf("You need to choose as a send or reciever!\n");
printf("Press 1 as a sender press 2 as a reciever\n");
scanf("%d",&select);
printf("input the shared password:");
scanf("%s",spasswd);// share key
srand( 123);
if(select !=1)
{//srv (reciever)
if(select==9) printf("program writed by peng ver. beta !");
/////////////////////////////////////////reciever program called serv ////////////////////////////////
printf("\ninput the file name to Output:");
scanf("%s",fn_out);
///////////通信握手///////
sock=BIO_get_accept_socket("3556",0);//3556 accept deal
n_key=BIO_new_socket(sock, BIO_NOCLOSE);
ret=BIO_accept(sock,NULL);
BIO_set_fd(n_key,ret,BIO_NOCLOSE);
strcpy(buff,"STKEYDEAL");
strcat(buff,"\0");
len=BIO_write(n_key,buff,strlen(buff));
len=BIO_read(n_key,buff,10);
if(strstr(buff,"ACCEPT")==NULL)
{
printf("\n ************sender not repeat correct respond!*************\n");
}
BIO_free(n_key);
printf("\n******************sender respond correct ACCEPT!******************\n");
////////////////////////////
//////// 随机数产生////////
f=BIO_new_file("new_key.dat","r");
f2=BIO_new_file("this_key.dat","w");
len=rand()%10;
for(i=0;i<=len;i++) BIO_read(f,buff,rand()%BUFFSIZE);
len=BIO_read(f,buff,BUFFSIZE);
BIO_write(f2,buff,len);
BIO_free(f);
BIO_free(f2);
///////////////////////////
/////随机数 求MD5码 并AES加密////////
/* i=0;
printf("\n****************************************************************\n buff:");
while(i<256)
{
printf("%X",buff[i]);
i++;
}
if(AES_set_encrypt_key((unsigned char *)(spasswd), bits,&mkey)!=0) printf("AES_set key error!");// 错误处理
p=&buff[0];q=&encpyted_buff[0];
for(i=0;i<BUFFSIZE/16;i++,p=p+16,q=q+16)
{AES_encrypt((unsigned char *)(p),(unsigned char *)(q),&mkey);}//加密随机数
*/
fileE((unsigned char *)(spasswd),"this_key.dat","reciever_key.dat");
MD5((unsigned char *)(buff),BUFFSIZE, passwd);//随机数的MD5为密钥
/*
i=0;
printf("\n****************************************************************\nencpyted buff:");
while(i<256)
{
printf("%X",encpyted_buff[i]);
i++;
}
*/
//// 质询 响应 认证过程 本次传输密钥发送////3555////
sock=BIO_get_accept_socket("3555",0);//3555 key deal
n_key=BIO_new_socket(sock, BIO_NOCLOSE);
ret=BIO_accept(sock,NULL);
BIO_set_fd(n_key,ret,BIO_NOCLOSE);
f=BIO_new_file("reciever_key.dat","r");
BIO_read(f,encpyted_buff,BUFFSIZE);
BIO_free(f);
BIO_write(n_key,encpyted_buff,BUFFSIZE);//发送加密的随机数
printf("\n************************ send the random number*************\n");
BIO_read(n_key,client_key_md5,BUFFSIZE/16);//接受响应
printf("passwd key:");
i=0;;
while(i<16)
{
printf("%X",passwd[i]);
i++;
}
MD5(passwd, BUFFSIZE/4,(unsigned char *)(local_key_md5) );//对密钥求MD5
printf("\n***************************************************************\nlocal key MD5:");
i=0;
while(i<16)
{
printf("%X",local_key_md5[i]);
i++;
}
printf("\n***************************************************************\n");
printf("***************************************************************\nclien key MD5:");
i=0;
while(i<16)
{
printf("%X",client_key_md5[i]);
i++;
}
printf("\n***************************************************************\n");
printf("***************************************************************\n");
for(i=0;i<(BUFFSIZE/16);i++)
{
if(local_key_md5[i]!=client_key_md5[i]) //响应密钥md5与本地 比较
{
printf("\n*********uncorrect code password not accept ************\n");//不匹配
BIO_free(n_key);
return 0;
}
}
printf("\npassword accept!\n");
BIO_free(n_key);
///////////////////////////////////////////
fileT(-1,netaddr);////接受远程文件
fileD(passwd,"tmpgetfile.dat",fn_out);///解密远程文件
/////////////文件 验证过程///////////////////
sock=BIO_get_accept_socket("3554",0);//3554 MD5 check
n_key=BIO_new_socket(sock, BIO_NOCLOSE);
ret=BIO_accept(sock,NULL);
BIO_set_fd(n_key,ret,BIO_NOCLOSE);
f=BIO_new_file("sendfilemd5.dat","w");
while(1)
{
len=BIO_read(n_key,buff,64);
if(len==0||len==-1) break;
BIO_write(f,buff,len);
}
BIO_free(f);
if( fileC("tmpgetfile.dat","getfilemd5.dat",-1)==0)
{printf("\n file recieved correct!\n");}//验证函数
else{ printf("file recieve uncorrect!");}
BIO_free(n_key);
////////////////////////reciever program end called srv end////////////////////////////////////////////////
}
else
{
/////////////////////////// send program called client ////////////////////////////////////////////
printf("\ninput the reciever IP address:");
scanf("%s",ip);
printf("\ninput the file name to Process:");
scanf("%s",fn_in);
loop_s:
///////////通信握手/////3556//
strcpy(netaddr,ip);
strcat(netaddr,":3556");
n_key=BIO_new_connect(netaddr);
if(BIO_do_connect(n_key) <= 0)
{
printf("\nError connecting to reciever maybe error IP address or net dosen't work\n");
}
len=BIO_read(n_key,buff,10);
if(strstr(buff,"STKEYDEAL")==NULL)
{//出错处理
printf("\n reciever is not correct respond! try again press 1 other will quit\n");
scanf("%d",&len);if(len!=1){return 0;}//len is temp used
printf("\ninput the reciever IP address:");
scanf("%s",ip);
goto loop_s;
}
printf(" \n*************Get right respond ! Now send accept sign!************\n");
strcpy(buff,"ACCEPT");
strcat(buff,"\0");
len=BIO_write(n_key,buff,strlen(buff));
BIO_free(n_key);
//////////////////////////////////////////
////// 质询响应 密钥交换过程//////3555/////
strcpy(netaddr,ip);
strcat(netaddr,":3555");
while(1)
{
n_key=BIO_new_connect(netaddr);
if(BIO_do_connect(n_key) >0 ) break;
}
BIO_read(n_key,encpyted_buff,BUFFSIZE);
/*
printf("\n****************************************************************\nencpyted buff:");
i=0;
while(i<BUFFSIZE)
{
printf("%X",encpyted_buff[i]);
i++;
}*/
f=BIO_new_file("sender_buff.dat","w");
BIO_write(f,encpyted_buff,BUFFSIZE);
BIO_free(f);
/*
if(AES_set_encrypt_key((unsigned char *)(spasswd), bits,&mkey)!=0) printf("AES_set key error!");
p=&encpyted_buff[0];q=&buff[0];
for(i=0;i<BUFFSIZE/16;i++,p=p+16,q=q+16)
{AES_decrypt((unsigned char *)(p),(unsigned char *)(q),&mkey);}
*/
fileD((unsigned char *)(spasswd),"sender_key.dat","sender_buff.dat");
f=BIO_new_file("sender_key.dat","r");
BIO_read(f,buff,BUFFSIZE);
BIO_free(f);
/*
i=0;
printf("\n****************************************************************\nbuff:");
while(i<BUFFSIZE)
{
printf("%X",buff[i]);
i++;
}
*/
MD5((unsigned char *)(buff), BUFFSIZE, passwd);
MD5((unsigned char *)(passwd), BUFFSIZE/4, (unsigned char *)(client_key_md5));
BIO_write(n_key,client_key_md5,BUFFSIZE/16);
BIO_free(n_key);
printf("\n********************* key exchanged OK!*************\n");
printf("passwd key:");
i=0;
while(i<16)
{
printf("%X",passwd[i]);
i++;
}
printf("\n*****************************************************\n");
////////////////////////////////////////////////
strcpy(netaddr,ip);
fileE(passwd,fn_in,"tmpsendfile.dat");/////加密指定文件
strcat(netaddr,"\0");
fileT(0,netaddr);///发送加密后的文件
fileC("tmpsendfile.dat","getfilemd5.dat",0);//生成校验文件
////校验文件发送过程////
f=BIO_new_file("getfilemd5.dat","r");
strcpy(netaddr,ip);
strcat(netaddr,":3554\0");//3554 md5 check
n_key=BIO_new_connect(netaddr);
while(1)
{
len=BIO_read(f,buff,64);
if(len==0||len==-1) break;
BIO_write(n_key,buff,len);
}
BIO_free(f);
BIO_free(n_key);
//////////////////////////
}
//////////////////copy right for peng ! 2008.10.15/////////////////////////////////
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -