⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stmain.cpp

📁 这是RSA算法的原代码实现应该直接能用,已调试好
💻 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 + -