资源简介
Qt异或实现文件加解密.rar

代码片段和文件信息
#include “xor.h“
#include
#include
#include
#include
#include
#include
#include
namespace Crypt
{
using std::min;
using std::bind;
using std::function;
using std::remove_cv;
using std::unique_ptr;
using std::remove_pointer;
using namespace std::placeholders;
typedef struct {
UCHAR Secret;
LPBYTE Sig;
DWORD SizeOfSig;
} KEY *PKEY;
template< typename _Ty >
BOOL IsEmptyString(_Ty &&psz) /* _NOEXCEPT */ { return !psz || !*psz; }
template< typename _Ty >
struct Ptr : public unique_ptr < _Ty function< VOID(typename remove_cv< _Ty>::type *) > >
{
template< typename _Pty > Ptr(_Pty &&_Ptr)
: unique_ptr < _Ty function< VOID(typename remove_cv< _Ty>::type *) > >(
std::forward< _Pty&&>(_Ptr)
[](typename remove_cv< _Ty >::type *h) { if (h && h != INVALID_HANDLE_VALUE) CloseHandle(h); })
{
}
};
namespace Impl /* 内部实现,不要直接调用 */
{
BOOL IsEncoded(_In_ HANDLE h _In_ DWORD SizeOfFile _In_ __readonly KEY *Key)
{
if (Key->SizeOfSig > SizeOfFile)
return FALSE;
if (SetFilePointer(h SizeOfFile - Key->SizeOfSig NULL FILE_BEGIN) ==
INVALID_SET_FILE_POINTER)
return FALSE;
unique_ptr< BYTE function< BOOL(PVOID)>>
p((LPBYTE)HeapAlloc(GetProcessHeap() HEAP_ZERO_MEMORY Key->SizeOfSig)
bind(HeapFree GetProcessHeap() IGNORE _1));
if (!p)
{
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
DWORD Readed = 0;
if (!ReadFile(h p.get() Key->SizeOfSig &Readed NULL) ||
Key->SizeOfSig != Readed)
return FALSE;
SetLastError(ERROR_SUCCESS);
return !memcmp(p.get() Key->Sig Key->SizeOfSig);
}
// 注:
// 此函数只承诺满足基本异常安全等级。若函数失败,文件的其中一部分可能已被修改。
template< typename _Fn >
BOOL Xor(_In_ HANDLE h _In_ DWORD SizeOfFile _In_ __readonly KEY *Key _Fn &&_Func)
{
DWORD Readed = 0;
BYTE Buffer[BUFSIZ] = { 0 };
while (SizeOfFile)
{
if (!ReadFile(h Buffer min((DWORD)sizeof(Buffer) SizeOfFile) &Readed NULL))
return FALSE;
SizeOfFile -= Readed;
for (DWORD i = 0; i < Readed; ++i)
Buffer[i] ^= Key->Secret;
if (SetFilePointer(h 0 - Readed NULL FILE_CURRENT) == INVALID_SET_FILE_POINTER)
return FALSE;
DWORD dw = 0;
while (Readed)
{
if (!WriteFile(h Buffer Readed &dw NULL))
return FALSE;
Readed -= dw;
}
}
return _Func(h Key->Secret Key->Sig Key->SizeOfSig);
}
}
/*
IsEncoded
检查一个文件是否已被使用 KEY 对象编码过。
参数:
NameOfFile,被检查的文件。
Key,测试在文件上的 KEY 对象。
返回值:
已被编码返回非零值,否则返回零。
注:
若函数返回零且 GetLastError 不为 ERROR_SUCCESS 表示检查失败,而非文件未被编码。
*/
BOOL IsEncoded(_In_z_ LPCTSTR NameOfFile _In_ __readonly KEY *Key )
{
if (IsEmptyString( NameOfFile ) || !Key )
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
Ptr< type
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5758 2019-01-02 11:53 异或实现文件加解密\main.cpp
文件 8078 2019-01-03 12:00 异或实现文件加解密\Qt中的实现.cpp
文件 145 2018-12-27 15:59 异或实现文件加解密\xor.cpp
文件 256 2018-12-27 15:59 异或实现文件加解密\xor.h
文件 63 2018-12-27 15:59 异或实现文件加解密\xor.qrc
文件 770 2018-12-27 15:59 异或实现文件加解密\xor.ui
文件 10700 2019-01-02 09:44 异或实现文件加解密\Xor.vcxproj
文件 2643 2018-12-27 15:59 异或实现文件加解密\Xor.vcxproj.filters
文件 581 2018-12-27 15:59 异或实现文件加解密\Xor.vcxproj.user
目录 0 2019-01-03 11:46 异或实现文件加解密
----------- --------- ---------- ----- ----
28994 10
- 上一篇:EncryptQtDemo.rar
- 下一篇:手写板绘图程序
相关资源
- PID_AutoTune_v0.rar
- vspd7.2.308.zip
- 价值2k的H漫画小说系统
- Pythonamp;课堂amp;笔记(高淇amp;400;集第
- ddos压力测试工具99657
- UML建模大全
- 开源1A锂电池充电板TP4056原理图+PCB
- m1卡 ic卡可选择扇区初始化加密软件
- TSCC.exe
- FTP课程设计(服务端+客户端)
- 计算机图形学 边填充算法实现代码
- 电力系统潮流计算程序集合
- oracle数据迁移项目实施方案
- Web Api 通过文件流 文件到本地
- Visio图标-最新最全的网络通信图标库
- Spire API文档
- OpenGL参考手册
- Python中Numpy库最新教程
- SPD博士V5.3.exe
- 直流无刷电机方波驱动 stm32 例程代码
- layui后台管理模板
- 仿知乎界面小程序源代码
- 云平台-阿里云详细介绍
- photoshop经典1000例
- scratch垃圾分类源码(最终版本).sb
- IAR ARM 7.8破解
- TI CCS V5.4 安装步骤及破解文件
- 松下plc FP-XH的驱动
- 局域网硬件信息收集工具
- 加快Windows XP操作系统开机速度
评论
共有 条评论