• 大小: 0.01M
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-23
  • 语言: 其他
  • 标签: 其他  

资源简介

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


评论

共有 条评论