[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <easyx.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
// 初始化GDI
void InitGDIPlus(ULONG_PTR* token)
{
GdiplusStartupInput input;
GdiplusStartup(token, &input, NULL);
}
// 释放GDI
void ShutdownGDIPlus(ULONG_PTR token)
{
GdiplusShutdown(token);
}
// XOR加密并保存至本地
void encryptImage(const char* srcFile, const char* dstFile, unsigned char key)
{
FILE* src = NULL;
FILE* dst = NULL;
fopen_s(&src, srcFile, "rb");
fopen_s(&dst, dstFile, "wb");
if (!src || !dst)
{
printf("文件打开失败!\n");
if (src) fclose(src);
if (dst) fclose(dst);
return;
}
fseek(src, 0, SEEK_END);
long fileSize = ftell(src);
fseek(src, 0, SEEK_SET);
unsigned char* buffer = (unsigned char*)malloc(fileSize);
fread(buffer, 1, fileSize, src);
for (long i = 0; i < fileSize; i++)
buffer[i] ^= key;
fwrite(buffer, 1, fileSize, dst);
free(buffer);
fclose(src);
fclose(dst);
printf("图片加密完成,保存为: %s\n", dstFile);
}
//从内存加载图片GDI,因为EasyX的loadimage函数不支持从内存加载图片
IMAGE* loadImageFromMemory(const unsigned char* buffer, DWORD size)
{
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, size);
if (!hMem) return NULL;
void* pMem = GlobalLock(hMem);
memcpy(pMem, buffer, size);
GlobalUnlock(hMem);
IStream* pStream = NULL;
if (CreateStreamOnHGlobal(hMem, TRUE, &pStream) != S_OK)
{
GlobalFree(hMem);
return NULL;
}
Gdiplus::Image* gdipImage = Gdiplus::Image::FromStream(pStream);
if (!gdipImage || gdipImage->GetLastStatus() != Gdiplus::Ok)
{
pStream->Release();
GlobalFree(hMem);
delete gdipImage;
return NULL;
}
int width = gdipImage->GetWidth();
int height = gdipImage->GetHeight();
IMAGE* img = new IMAGE(width, height);
HDC hdc = GetImageHDC(img);
Graphics graphics(hdc);
graphics.DrawImage(gdipImage, 0, 0, width, height);
delete gdipImage;
pStream->Release();
GlobalFree(hMem);
return img;
}
// 异或解密内存加载函数
IMAGE* decryptImageInMemory(const char* encFile, unsigned char key)
{
FILE* file = NULL;
fopen_s(&file, encFile, "rb");
if (!file)
{
printf("加密文件打开失败: %s\n", encFile);
return NULL;
}
fseek(file, 0, SEEK_END);
DWORD fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
unsigned char* buffer = (unsigned char*)malloc(fileSize);
fread(buffer, 1, fileSize, file);
fclose(file);
for (DWORD i = 0; i < fileSize; i++)
buffer[i] ^= key;
IMAGE* img = loadImageFromMemory(buffer, fileSize);
free(buffer);
if (img)
printf("图片解密成功!\n");
else
printf("图片解密失败!\n");
return img;
}
int main()
{
// 初始化 EasyX
initgraph(800, 600, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
// 初始化 GDI+
ULONG_PTR gdipToken;
InitGDIPlus(&gdipToken);
unsigned char key = 0xAA;
//将当前目录下1.png 异或加密0xAA并保存为1_xor.dat
encryptImage("1.png", "1_xor.dat", key);
//从当前目录读取 1_xor.dat 进行异或0xAA解密并加载图片
IMAGE* img = decryptImageInMemory("1_xor.dat", key);
if (img)
{
putimage(0, 0, img);
delete img;
}
else
{
printf("加载图片失败!\n");
}
system("pause");
// 释放 GDI+
ShutdownGDIPlus(gdipToken);
closegraph();
return 0;
}