📄 filecipheragent.cpp
字号:
// FileCipherAgent.cpp: implementation of the CFileCipherAgent class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FileCipher.h"
#include "FileCipherAgent.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFileCipherAgent::CFileCipherAgent()
{
fpIn=fpOut=NULL;
m_pformat=NULL;
m_bIsClosed=false;
Reset();
}
CFileCipherAgent::~CFileCipherAgent()
{
Reset();
}
void CFileCipherAgent::Reset()
{
m_dwBlockCount=m_dwCurPos=m_dwFileLen=0;
m_nStartPos=m_nProcBlockStep=m_nProcBlockLen=0;
if(fpIn)
fclose(fpIn);
if(fpOut)
fclose(fpOut);
}
void CFileCipherAgent::SetFormat(pCipherOptionsFormat pformat)
{
m_pformat=pformat;
if(m_pformat->bIsProcEachBlock){
// 每一个数据包进行处理
m_nProcBlockStep=1;
m_nStartPos=0;
m_nProcBlockLen=BLOCK_EACH_SIZE*m_pformat->fProcPercent/100;
}
else
{
m_nProcBlockStep=100/m_pformat->fProcPercent;
m_nStartPos=0;
m_nProcBlockLen=BLOCK_EACH_SIZE;
}
}
void CFileCipherAgent::PrepareFile(char *strInFile, char *strOutFile)
{
if(!PubFileIsExisted(strInFile))
{ AfxMessageBox("输入文件不存在!!!");
goto ErrorLine;
}
fpIn=fopen(strInFile,"rb");
if(!fpIn) goto ErrorLine;
fseek(fpIn,0,SEEK_END);
m_dwFileLen=ftell(fpIn);
fseek(fpIn,0,SEEK_SET);
m_dwBlockCount=PubGetDivInt(m_dwFileLen,BLOCK_EACH_SIZE);
fpOut=fopen(strOutFile,"wb");
if(!fpOut)
{AfxMessageBox("目标文件生成错误!");
goto ErrorLine;
}
// if(fpIn) fclose(fpIn);
// if(fpOut)fclose(fpOut);
return;
ErrorLine:
if(fpIn) fclose(fpIn);
if(fpOut)fclose(fpOut);
}
int CFileCipherAgent::ReadBlock( int nlen)
{
return fread(m_zbuffer,1,nlen,fpIn);
}
int CFileCipherAgent::WriteBlock(int nlen)
{
return fwrite(m_zbuffer,1,nlen,fpOut);
return 0;
}
void CFileCipherAgent::EnFile()
{
m_pformat->bIsEncrpty=true;
PrepareThread();
}
void CFileCipherAgent::CipherBlock(int nret)
{
//f(m_dwCurBlockIndex==0)return;
if(fmod(m_dwCurBlockIndex,m_nProcBlockStep)!=0) return;
int nlen=min(nret,m_nProcBlockLen);
switch(m_pformat->zFunType)
{
case CIPHER_TYPE_3DES:
des_cipher((unsigned char *)m_zbuffer+m_nStartPos,nlen,
m_pformat->key,EN0);
break;
case CIPHER_TYPE_SIMPLE:
EncryptBuffer(m_zbuffer,m_zbuffer,m_nStartPos,nlen,
BLOCK_EACH_SIZE,m_pformat->key,8);
break;
default:
break;
}
// TRACE("Cipher %d \n",m_dwCurBlockIndex);
}
DWORD CFileCipherAgent::DaemonThread()
{
int nret=0;
float fper=0;
char szbuff[64],szbuff2[64];
fseek(fpIn,0,SEEK_SET);
m_dwCurPos=m_dwCurBlockIndex=0;
PubSwapToDotString(szbuff,m_dwFileLen);
m_bIsClosed=false;
m_dwPreUpClick=m_dwStartClick=timeGetTime();
while(!feof(fpIn))
{ if(m_bIsClosed)
break;
nret=ReadBlock();
if(m_pformat->bIsEncrpty)
CipherBlock(nret);
else
DecipherBlock(nret);
WriteBlock(nret);
m_dwCurPos+=nret;
m_dwCurBlockIndex++;
//TRACE("Block Index=%d fper=%.2f m_dwCurPos:%d ret=%d\n",m_dwCurBlockIndex,fper,
// m_dwCurPos,nret);
if((timeGetTime()-m_dwPreUpClick)>=1000){
fper=100*(m_dwCurPos/1024)/(m_dwFileLen/1024);
PubSwapToDotString(szbuff2,m_dwCurPos);
sprintf(g_strProcMess,"PosSize:%s/%s B Per:%.2f%%",
szbuff2,szbuff,fper);
::PostMessage(g_hProcWnd,MSG_SEND_PROGRESS,0,(int)fper);
m_dwPreUpClick=timeGetTime();
}
// Sleep(10);
}// end while feo(fpin);
fclose(fpIn);
fclose(fpOut);
DWORD dwttl=timeGetTime()-m_dwStartClick;
DWORD bitrate=::PubGetBitrate(dwttl,m_dwFileLen);
sprintf(szbuff,"数据处理完成 Time:%d Bitrate=%dkbps",
dwttl/1000,
bitrate/1000);
AfxMessageBox(szbuff);
return 0;
}
void CFileCipherAgent::DecipherBlock(int nret)
{
//f(m_dwCurBlockIndex==0)return;
if(fmod(m_dwCurBlockIndex,m_nProcBlockStep)!=0) return;
int nlen=min(nret,m_nProcBlockLen);
switch(m_pformat->zFunType)
{
case CIPHER_TYPE_3DES:
des_cipher((unsigned char *)m_zbuffer+m_nStartPos,nlen,
m_pformat->key,DE1);
break;
case CIPHER_TYPE_SIMPLE:
EncryptBuffer(m_zbuffer,m_zbuffer,m_nStartPos,nlen,
BLOCK_EACH_SIZE,m_pformat->key,8);
break;
default:
break;
}
}
void CFileCipherAgent::DenFile()
{
//CBaseThread::Close();
m_pformat->bIsEncrpty=false;
PrepareThread();
}
void CFileCipherAgent::Close()
{ m_bIsClosed=true;
CBaseThread::Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -