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

📄 myencryptfile.cpp

📁 SQLBig5BugTool 宽字符操作问题
💻 CPP
字号:
// MyEncryptFile.cpp: implementation of the CMyEncryptFile class.
//
//////////////////////////////////////////////////////////////////////

#include "MyEncryptFile.h"

#include "stdio.h"
#include "stdlib.h"
#include "io.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMyEncryptFile::CMyEncryptFile(int nSeed) : m_pBuf(NULL), m_nSize(0)
{
	::srand(nSeed);

	for (int i=0; i<ENCRYPT_SIZE; i++)
	{
		m_bufCode[i] = ::rand()%256;
	}
}

CMyEncryptFile::~CMyEncryptFile()
{
	this->Close();
}

//////////////////////////////////////////////////////////////////////
bool CMyEncryptFile::Open(const char* pszFile)
{
	if (!pszFile)
		return false;

	this->Close();

	// open and read file
	FILE* fp = fopen(pszFile, "rb");
	if (!fp)
		return false;

	m_nSize = filelength(fileno(fp));
	m_pBuf	= malloc(m_nSize);
	if (!m_pBuf)
	{
		fclose(fp);
		return false;
	}

	if (1 != fread(m_pBuf, m_nSize, 1L, fp))
	{
		fclose(fp);
		return false;
	}

	fclose(fp);

	// decrypt file
	this->Decrypt(m_pBuf, m_nSize);
	return true;
}

//////////////////////////////////////////////////////////////////////
void CMyEncryptFile::Close()
{
	if (m_pBuf)
		free(m_pBuf);

	m_pBuf = NULL;
	m_nSize = 0;
}

//////////////////////////////////////////////////////////////////////
// 加密算法是循环左移offset%8, 然后异或大小为128的buf
void CMyEncryptFile::Encrypt(void* pBuf, int nSize)
{
	if (!pBuf || nSize <= 0)
		return;

	BYTE* buf = (BYTE*)pBuf;
	for (int i=0; i<nSize; i++)
	{
		BYTE c = (buf[i] << (i%8)) + (buf[i] >> (8 - i%8));
		buf[i] = c^m_bufCode[i%ENCRYPT_SIZE];
	}
}

//////////////////////////////////////////////////////////////////////
void CMyEncryptFile::Decrypt(void* pBuf, int nSize)
{
	if (!pBuf || nSize <= 0)
		return;
	
	BYTE* buf = (BYTE*)pBuf;
	for (int i=0; i<nSize; i++)
	{
		BYTE c = buf[i]^m_bufCode[i%ENCRYPT_SIZE];			
		buf[i] = (c >> (i%8)) + (c << (8 - i%8));
	}
}

//////////////////////////////////////////////////////////////////////
bool CMyEncryptFile::EncryptFile(const char* pszFile)
{
	if (!pszFile)
		return false;
	
	// open and read file
	FILE* fp = fopen(pszFile, "rb");
	if (!fp)
		return false;
	
	int nSize	= filelength(fileno(fp));
	void* pBuf	= malloc(nSize);
	if (!pBuf)
	{
		fclose(fp);
		return false;
	}
	
	if (1 != fread(pBuf, nSize, 1L, fp))
	{
		fclose(fp);
		return false;
	}
	
	fclose(fp);
	
	// encrypt buf
	this->Encrypt(pBuf, nSize);
	
	// save encrypted file
	char szEncryptFile[256] = "";
	sprintf(szEncryptFile, "%s.encrypt", pszFile);
	
	fp = fopen(szEncryptFile, "wb");
	if (!fp)
		return false;
	
	fwrite(pBuf, nSize, 1L, fp);
	fclose(fp);
	
	return true;	
}

⌨️ 快捷键说明

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