📄 serpentgbndlg.cpp
字号:
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 + -