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

📄 serpentgbndlg.cpp

📁 本人本科的毕业设计。基于Serpent密码的回退N协议的数据传输。希望可供大家参考。谢谢诶!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
ReleaseMutex(hMutex);
} 
closesocket(pDlg->m_sockConn1);
}

void CALLBACK CSerpentGBNDlg::ClientFunc(LPVOID pParam)
{
    CString   strShowDisp   =_T("");   
    CString   strTempDisp   =_T(""); 
	DWORD dwRet;
//	DWORD dwIP=(DWORD)((param*)pParam)->dwIP;
	CSerpentGBNDlg *pDlg=(CSerpentGBNDlg*)pParam;
	 static int flag=0;

while(1)
{   
	Sleep(300);
    WaitForSingleObject(hEvent,INFINITE);	

  dwRet=recv(pDlg->m_sockClient,(char*)&frame_received,sizeof(frame_received),0);
  if(dwRet == SOCKET_ERROR)
  {
	SetEvent(hEvent);
	continue;
  }		 
 
   
   if(frame_received.seq==seq_expected)
   {  
	   ciphertext[seq_expected]=frame_received.info;
	   frame_to_send.info=0;	 
	  	  frame_to_send.seq=frame_received.seq;    
   }  
    if(flag==0)
	{	pDlg->frameCount=frame_received.totalFrame;
	  flag=1;
	}
    ResetEvent(hEvent); 
	SetEvent(hEvent1);
}
	closesocket(pDlg->m_sockClient);  

}

void CALLBACK CSerpentGBNDlg::sendFunc(LPVOID pParam)
{    
    CString   strShow   =_T("");   
    CString   strTemp   =_T(""); 
    CString   strShowDisp   =_T("");   
    CString   strTempDisp   =_T(""); 
    static int random=0;
	frame_to_send.frameType=data;
    DWORD dwRet;
	CSerpentGBNDlg *pDlg=(CSerpentGBNDlg*)pParam;

	while(1)
	{	 	                         
	Sleep(1000); 
		WaitForSingleObject(hEvent1,INFINITE);
	
/*    int rand[8]={1,2,3,4,5,6,7,8};
    static int i=0;
	int random=rand[i]%2;
  switch(random)	
  {   case 0:		 
    
     strTempDisp.Format("共%d帧",frame_received.totalFrame); 
     strShowDisp=strTempDisp;
	pDlg->m_Disp.AddString(strShowDisp);
     pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);
	strTempDisp.Format("收到第%d帧",frame_received.seq+1); 
    strShowDisp=strTempDisp;
    pDlg->m_Disp.AddString(strShowDisp); 
	pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);
    frame_to_send.frameType=ack;    
	inc(seq_expected);	
	strTemp.Format("%lx",frame_received.info); 
	strShow+=strTemp;
    pDlg->GetDlgItem(IDC_msgRcv)->SetWindowText(strShow); 

	if(frame_received.seq==frame_received.totalFrame-1)
	{	
     pDlg->m_Disp.AddString("接收完毕!");
     pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);
	
	TerminateThread(hThreadClientRecv, 0);
	CloseHandle(hThreadClientRecv);
	TerminateThread(hThreadClientSend, 0);
	CloseHandle(hThreadClientSend);

	CloseHandle(hEvent);
	CloseHandle(hEvent);
	} 
    break;
    case 1:
	frame_to_send.frameType=nak;   //模拟校验错误,请求重传
	strTempDisp.Format("第%d帧校验错误,请求重传",seq_expected+1); 
    strShowDisp=strTempDisp;
    pDlg->m_Disp.AddString(strShowDisp); 
	pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);   //垂直滚动到底部
	seq_expected=frame_to_send.seq; 
	break;
	default:
		break;
}	
inc(i);  */ 
	if(frame_received.seq<frame_received.totalFrame-1)
	{ 
	 strTempDisp.Format("共%d帧",frame_received.totalFrame); 
     strShowDisp=strTempDisp;
 	pDlg->m_Disp.AddString(strShowDisp);
     pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);
	strTempDisp.Format("收到%d帧",(frame_received.seq)%8); 
    pDlg->m_Disp.AddString(strTempDisp); 
	pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);
    frame_to_send.frameType=ack;    
    dwRet=send(pDlg->m_sockSend,(char*)&frame_to_send,sizeof(frame_to_send),0); 
	seq_expected++;	
	if(1)
	{
	if(file1==0)
	{
	strTemp.Format("%lx",frame_received.info); 
	strShow+=strTemp;
    pDlg->GetDlgItem(IDC_msgRcv)->SetWindowText(strShow); 
	}
	else if(file1==1)
	{
	 strTempDisp.Format("现在状态为%d",file1); 
    pDlg->m_Disp.AddString(strTempDisp); 
	pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);   //垂直滚动到底部
	pDlg->cipherStore[frame_received.seq]=frame_received.info;
//	pDlg->fileDes.Write(&pDlg->cipherStore[frame_received.seq],4);	
	strTemp.Format("%lx",pDlg->cipherStore[frame_received.seq]); 
//	strShow=strTemp;
    pDlg->m_Disp.AddString(strTemp); 
	pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);   //垂直滚动到底部
   }
	}
	 if(frame_received.seq==frame_received.totalFrame-1)
	{	
     	strTempDisp.Format("收到%d帧",(frame_received.seq)%8); 
    pDlg->m_Disp.AddString(strTempDisp); 
	pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);
    frame_to_send.frameType=ack; 
     dwRet=send(pDlg->m_sockSend,(char*)&frame_to_send,sizeof(frame_to_send),0);
     pDlg->m_Disp.AddString("接收完毕!");
     pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);
     seq_expected=0;

	 	CloseHandle(hEvent);
	CloseHandle(hEvent1);
	TerminateThread(hThreadClientRecv, 0);
	CloseHandle(hThreadClientRecv);
	TerminateThread(hThreadClientSend, 0);
	CloseHandle(hThreadClientSend);  
	} 
	}
   else if(frame_received.seq==6)
	{
	frame_to_send.frameType=nak;   //模拟校验错误,请求重传
    dwRet=send(pDlg->m_sockSend,(char*)&frame_to_send,sizeof(frame_to_send),0);
	strTempDisp.Format("%d帧校验错误,请求重传",(seq_expected)%8); 
    pDlg->m_Disp.AddString(strTempDisp); 
	pDlg->m_Disp.SetCurSel(pDlg->m_Disp.GetCount()-1);   //垂直滚动到底部
	seq_expected=frame_to_send.seq; 
	
   } 

//if(dwRet==SOCKET_ERROR){
//  SetEvent(hEvent1);		
//		continue;}
     
	 ResetEvent(hEvent1);
	 SetEvent(hEvent);
}
 closesocket(pDlg->m_sockSend);
}

void CSerpentGBNDlg::OnTimer(unsigned int nIDEvent)    //定时器处理事件
{
	KillTimer(nIDEvent); 
	if(nIDEvent<8)
	{ 
	CString	strTempDisp;	
	seq_to_send = nIDEvent;
    currentSize--;
	strTempDisp.Format("%d帧超时重传",(seq_to_send)%8); 
    m_Disp.AddString(strTempDisp); 
	m_Disp.SetCurSel(m_Disp.GetCount()-1);   //垂直滚动到底部
	}
}

void CSerpentGBNDlg::OnMakeKey() 
{
	// TODO: Add your control notification handler code here
		CString Str;
	GetDlgItemText(IDC_key,Str);
//  GetDlgItem(IDC_key)->GetWindowText(Str);
	 while(Str.GetLength()<32)
		 Str+=" ";                   //扩充密钥
       char *key;
	 key=new char[32];
	 for(int j=0;j<32;j++)
		 key[j]=0;
       key=(LPTSTR)(LPCTSTR)Str;       
	   SerpentProc.MakeKey(key);
	   //输出子密钥
  CString   strShow   =_T("");   
  CString   strTemp   =_T("");   
  for(int i=0;i<33;i++)   
  {
	  strShow+="第";
	  strTemp.Format("%d",i+1); 
	  strShow+=strTemp; 
	  strShow+="个子密钥为:";
	  for(int j=0;j<4;j++)
	  {
	  strTemp.Format("%lx",SerpentProc.subkeys[i][j]);   
      strShow+=strTemp;   
	  }	 
	  strShow+="\r\n";
  }
  	SetDlgItemText(IDC_subkeys,strShow);
}



void CSerpentGBNDlg::Onjiami() 
{
	// TODO: Add your control notification handler code here
  CString   mingwen   =_T("");   
  CString   miwen   =_T("");  
  CString   sendMsg   =_T("");  
  CString   cipher   =_T("");  
  GetDlgItem(IDC_mingwen)->GetWindowText(mingwen);
  GetDlgItem(IDC_msgSend)->GetWindowText(sendMsg);
  	if(sendMsg.IsEmpty())
	{
		AfxMessageBox("加密消息不能为空!");
		return;
	}
	mingwen+= sendMsg;
	mingwen+= "\r\n";
	GetDlgItem(IDC_mingwen)->SetWindowText(mingwen);
    //加密
    SerpentProc.Encrypt(sendMsg,cipher);
	GetDlgItem(IDC_miwen)->GetWindowText(miwen);
      miwen +=cipher;
	  	miwen +="\r\n";	
    GetDlgItem(IDC_miwen)->SetWindowText(miwen);
	GetDlgItem(IDC_msgSend)->SetWindowText("");
	frameCount=SerpentProc.round*4;
	 CString   strTempDisp   =_T("");   
     CString   strShowDisp   =_T("");  
	strTempDisp.Format("共%d帧",frameCount); 
    strShowDisp=strTempDisp;
    m_Disp.AddString(strShowDisp); 
     for(UINT i=0;i<frameCount;i++)
		 cipherTo[i]=SerpentProc.cipherOut[i];
}


void CSerpentGBNDlg::Onjiemi() 
{
	// TODO: Add your control notification handler code here
  CString   mingwen   =_T("");   
  CString   miwen   =_T("");  
  CString   rcvMsg   =_T("");  
  CString   plaint   =_T("");  
    GetDlgItem(IDC_miRcv)->GetWindowText(miwen);
    GetDlgItem(IDC_msgRcv)->GetWindowText(rcvMsg);
//	GetDlgItem(IDC_miwen)->GetWindowText(rcvMsg);
	miwen+= rcvMsg;

	miwen+= "\r\n";
	GetDlgItem(IDC_miRcv)->SetWindowText(miwen);
	GetDlgItem(IDC_mingRcv)->GetWindowText(mingwen);
    //解密
    SerpentProc.Decrypt(rcvMsg,plaint);
		MessageBox(plaint);
        mingwen +=plaint;
	   	mingwen +="\r\n";	
    GetDlgItem(IDC_mingRcv)->SetWindowText(mingwen);
	GetDlgItem(IDC_msgRcv)->SetWindowText("");
	
}

void CSerpentGBNDlg::OnSelectEFile() 
{
	// TODO: Add your control notification handler code here
   	CString disp;
	CString filename;
	CFileDialog dlg(TRUE);
	if (IDOK == dlg.DoModal()) 
	{
	 srcPath=dlg.GetPathName();
	 filename=dlg.GetFileName();

	 disp.Format("加密文件名为:%s",srcPath);
     m_Disp.AddString(disp);
	 m_Disp.SetCurSel(m_Disp.GetCount()-1);   //垂直滚动到底部	 	 
	
	 disp.Format("加密文件路径为:%s",srcPath);
     m_Disp.AddString(disp);
	 m_Disp.SetCurSel(m_Disp.GetCount()-1);   //垂直滚动到底部	 
	}	
		else
	{
		return;
	}
}

void CSerpentGBNDlg::OnEncrypt() 
{
	// TODO: Add your control notification handler code here
	CFileDialog dlg(FALSE);

	if (IDOK == dlg.DoModal()) 
	{
		desPath=dlg.GetPathName();
	}	
		else
	{
		return;
	}

	CFileException e;
	
	if (!fileSrc.Open(srcPath, CFile::modeRead | CFile::shareDenyWrite, &e)) 
	{
		e.Delete();
		return;
	}
	if (!fileDes.Open(desPath, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive, &e)) 
	{
		fileSrc.Close();
		e.Delete();
		return;
	}
	//文件长度
	int nFileLen = fileSrc.GetLength();
	//以128位(16字节)为一包,打包应该有多少包
	//对于最后不足16个字节将划为单独一包
	int nPackCnt = nFileLen / 16;
	if (nFileLen % 16!=0) 
	{
		nPackCnt += 1;
	}
	ULONG inText[4]; //需要加密的数据
	ULONG outText[4];//加密后的数据
	int nPackSize = sizeof(DWORD) * 4;
	for (int nPack = 0; nPack < nPackCnt; nPack++) 
	{
		//最后一包的处理
		if (nPack == nPackCnt - 1) 
		{
			memset(inText, 0, sizeof inText);
			fileSrc.Read(inText, (0 == nFileLen % 16) ? 16 : (nFileLen % 16));
		}
		else
		{
			fileSrc.Read(inText, nPackSize);
		}
		//加密这一包数据
		SerpentProc.EncryptProc(inText, outText);
		//将加密后数据写入
		fileDes.Write(outText, nPackSize);
	}
	fileSrc.Close();
	fileDes.Close();
     m_Disp.AddString("加密完毕!");
	 m_Disp.SetCurSel(m_Disp.GetCount()-1);   //垂直滚动到底部	 
}


void CSerpentGBNDlg::OnSelectDFile() 
{
	// TODO: Add your control notification handler code here
		CFileDialog dlg(TRUE);
	if (IDOK == dlg.DoModal()) 
	{
	 srcPath=dlg.GetPathName();
	}
		else
	{
		return;
	}
}


void CSerpentGBNDlg::OnDecrypt() 
{
	// TODO: Add your control notification handler code here
	CFileDialog dlg(FALSE);
	if (IDOK == dlg.DoModal()) 
	{
		desPath=dlg.GetPathName();
	}	
	else
	{
		return;
	}
	CFile fileDes, fileSrc;
	CFileException e;	
	if (!fileSrc.Open(srcPath, CFile::modeRead | CFile::shareDenyWrite, &e)) 
	{
		e.Delete();
		return;
	}
	if (!fileDes.Open(desPath, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive, &e)) 
	{
		fileSrc.Close();
		e.Delete();
		return;
	}
		//文件长度
	int nFileLen = fileSrc.GetLength();
	int nPackCnt = nFileLen / 16;	
	ULONG inText[4];
	ULONG outText[4];
	int nPackSize = sizeof(DWORD) * 4;
	for (int n = 0; n < nPackCnt; n++) 
	{
		fileSrc.Read(inText, nPackSize);

		SerpentProc.DecryptProc(inText, outText);
		fileDes.Write(outText, nPackSize);		
	}		
	fileSrc.Close();
	fileDes.Close();
	 m_Disp.AddString("解密完毕!");
	 m_Disp.SetCurSel(m_Disp.GetCount()-1);   //垂直滚动到底部	 
	 MessageBox("解密完毕!");
}

void CSerpentGBNDlg::Onintroduction() 
{
	// TODO: Add your control notification handler code here
	 DlgIntroduce intro;
	 intro.DoModal();
}

void CSerpentGBNDlg::OnSendFile() 
{
	// TODO: Add your control notification handler code here
			file1=1;
	CString filename;
	CFileDialog dlg(TRUE);
	if (IDOK == dlg.DoModal()) 
	{
	 srcPath=dlg.GetPathName();
	 filename=dlg.GetFileName();
	}
	else
	{	return;
	}
	CFile fileSrc;
	CFileException e;	
	if (!fileSrc.Open(srcPath, CFile::modeRead | CFile::shareDenyWrite, &e)) 
	{
		e.Delete();
		return;
	}
//	int nPackSize = sizeof(DWORD) * 4;
	int nFileLen = fileSrc.GetLength();
	frameCount = nFileLen / 4;
	for (UINT n = 0; n < frameCount; n++) 
	{
		fileSrc.Read(&cipherTo[n], 4);	
	}
    	fileSrc.Close();
hMutex=CreateMutex(NULL,FALSE,NULL);
hEvent=CreateEvent(NULL,true,false,NULL);
hThreadServerSend=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ServerFunc,this,0,NULL);
hThreadServerRecv=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)responseFunc,this,0,NULL);
}


void CSerpentGBNDlg::OnRecvFile() 
{
	// TODO: Add your control notification handler code here
file1=1;
hMutex=CreateMutex(NULL,FALSE,NULL);
hEvent=CreateEvent(NULL,true,true,NULL);
hEvent1=CreateEvent(NULL,true,false,NULL);

     
hThreadClientRecv=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ClientFunc,this,CREATE_SUSPENDED,NULL);
hThreadClientSend=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)sendFunc,this,CREATE_SUSPENDED,NULL);

ResumeThread(hThreadClientRecv);
ResumeThread(hThreadClientSend);	

}

void CSerpentGBNDlg::OnfileStore() 
{
	// TODO: Add your control notification handler code here

	  	CFileDialog dlg(FALSE);
	if (IDOK == dlg.DoModal()) 
	{
		desPath=dlg.GetPathName();
	}	
	else
	{
		return;
	}
	CFile fileDes;
	CFileException e;
	if (!fileDes.Open(desPath, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive, &e)) 
	{
		e.Delete();
		return;
	}

//	   CString   strShowDisp1   =_T("");   
 //      CString   strTempDisp1   =_T(""); 
//over=1;
//	fileDes.Close();

//if(over==1)
//{
//	 strTempDisp1.Format("现在状态为%d",over); 
 //          strShowDisp1=strTempDisp1;
 //          m_Disp.AddString(strShowDisp1); 
//	       m_Disp.SetCurSel(m_Disp.GetCount()-1);   //垂直滚动到底部
	//	   break;
   for(UINT i=0;i<frameCount;i++)
     fileDes.Write(&cipherStore[i],4);

	frameCount=0;

	MessageBox("接收文件完毕!");

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -