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

📄 filecipheragent.cpp

📁 一个用3DES加密文件的小测试程序!
💻 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 + -