# xencrypt
**Repository Path**: young_way/xencrypt
## Basic Information
- **Project Name**: xencrypt
- **Description**: A simple and fast cross platform library for encrypting and decrypting data. It supports custom encryptor and decryptor.
高效跨平台的加密/解密数据库.支持自定义的加密器和解密器.
- **Primary Language**: C++
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-12-07
- **Last Updated**: 2025-04-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# x-encrypt
简单,高效,跨平台的自定义加密/解密库.
支持自定义的加密/解密器
### 支持系统
|系统|支持||
|---------------|----------------------|-------|
|Windows|x86
x86_64
|[✔]
[✔]
|
|Linux|x86_64
|[✔]
|
|osx|x86_64
|[✔]
|
|Android|armeabi-v7a
arm64-v8a
x86
x86_64
|[✔]
[✔]
[✔]
[✔]
|
|iOS|arm64|[✔]
|
|tvOS|arm64|[✔]
|
|UWP|x86
x86_64
arm64
|[✔❗未测试]
[✔❗未测试]
[✔❗未测试]
|
## 使用CMake编译x-Encrypt的测试程序和示例程序
```sh
git clone --recursive https://github.com/Y-way/x-encrypt
cd x-encrypt
# 如果是macOS Xcode, 这里命令应该换成:cmake -B build -GXcode
cmake -B build -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DPLAT=iOS -DDEPLOYMENT_TARGET=11.0
# 使用CMake命令行编译, 如果需要调试,则使用相应平台IDE打开即可:
# a. Windows:使用VisualStudio打开build/CXEncrypt.sln
# b. macOS:使用Xcode打开build/CXEncrypt.xcodeproj
cmake --build build --config Debug
# # 者直接用VS打开
```
## CMake 编译说明
|编译宏|值|默认|说明|
|---------------|----------------------|----|--------|
|SUPPORT_ENCRYPT|ON:支持
OFF:关闭|ON |支持加密|
|SUPPORT_DECRYPT|ON:支持
OFF:关闭|ON |支持解密|
|XENCRYPT_TESTS |ON:支持
OFF:关闭|OFF |测试用例|
#### 注:
`SUPPORT_ENCRYPT`和`SUPPORT_DECRYPT`必须至少开启其中一个
## 快速开始
```cpp
// CXEncrypt.cpp: 定义应用程序的入口点。
#include "iostream"
#include "CXEncrypt.h"
#include "encrypt/service/XService.h"
#include "encrypt/service/Common.h"
#include "encrypt/RuntimeApi.h"
#include "encrypt/common/Allocator.h"
#include "encrypt/plugin/xef/XEncodeType.h"
#include "encrypt/plugin/xef/XEFPlugin.h"
#include "encrypt/plugin/xef/XEFRuntimeApi.h"
using namespace std;
using namespace xencrypt;
const byte rawData[] = { 'T','h','i','s',' ','a',' ','t','e','s','t',' ','d', 'a', 't', 'a', '\0', };
int64_t length = sizeof(rawData);
int main()
{
{
//C++
XEFPlugin* plugin = new XEFPlugin(XEncodeType::XGZip, 32);
//start service
XService* service = new XService(plugin);
//Encrypting data
if(service->IsEncrypted(rawData, length))
{
std::cout<<"data has been encrypted."<Encrypt(rawData, length);
byte* encryptedData = nullptr;
int64_t encryptedDataLength = 0;
if (result->GetCode() != ResultCode::Ok)
{
//todo something.
}
else
{
encryptedDataLength = result->GetDataSize();
//continue to do something for encryptedData.
encryptedData = (byte*)XMEMORY_MALLOC(encryptedDataLength);
memcpy((void*)encryptedData, result->GetData(), encryptedDataLength);
}
service->ReleaseResult(result);
result = nullptr;
//Decrypting data
if(!service->IsEncrypted(encryptedData, encryptedDataLength))
{
cout<<"data dose not have been encrypted."<Decrypt(encryptedData, encryptedDataLength, true);
if (result->GetCode() != ResultCode::Ok)
{
//todo something.
}
else
{
//continue to do something for decryptedData.
decryptedData = (byte*)XMEMORY_MALLOC(result->GetDataSize());
memcpy((void*)decryptedData, result->GetData(), result->GetDataSize());
}
service->ReleaseResult(result);
result = nullptr;
//stop service
delete service;
service = nullptr;
delete plugin;
plugin = nullptr;
XMEMORY_SAFE_FREE(encryptedData);
XMEMORY_SAFE_FREE(decryptedData);
}
{
//C API
void* plugin = xef_plugin_create(XEncodeType::XGZip, 32);
//start service
void* service = xencrypt_service_initialize(plugin);
//Encrypting data
if(xencrypt_service_is_encrypted(service, rawData, length))
{
printf("data has been encrypted.");
}
xencrypt_result result = xencrypt_service_encrypt(service, rawData, length);
byte* encryptedData = nullptr;
int64_t encryptedDataLength = result.size;
if (result.code != ResultCode::Ok)
{
//todo something.
}
else
{
//continue to do something for encryptedData.
encryptedData = (byte*)XMEMORY_MALLOC(result.size);
memcpy((void*)encryptedData, result.data, result.size);
}
xencrypt_service_release_result(service, &result);
//Decrypting data
if(!xencrypt_service_is_encrypted(service, encryptedData, length))
{
printf("data dose not have been encrypted.");
}
byte* decryptedData = nullptr;
result = xencrypt_service_decrypt(service, encryptedData, encryptedDataLength);
if (result.code != ResultCode::Ok)
{
//todo something.
}
else
{
//continue to do something for decryptedData.
decryptedData = (byte*)XMEMORY_MALLOC(result.size);
memcpy((void*)decryptedData, result.data, result.size);
}
xencrypt_service_release_result(service, &result);
//stop service
xencrypt_service_deinitialize(service);
service = nullptr;
xef_plugin_destroy(plugin);
plugin = nullptr;
XMEMORY_SAFE_FREE(decryptedData);
XMEMORY_SAFE_FREE(encryptedData);
}
getchar();
}
```
## 扩展自定义加密/解密器.
1)实现'XPlugin'插件接口类
2)实现'Encoder'编码接口类,用于支持数据加密
3)实现'Decoder'解码接口类,用于支持数据解密.
4)实现'IsEncrypted'判定是否加密接口,用于判定数据是否加密.
## 参考 'encrypt/plugin/xef/'目录下 XEF格式文件(数据)加密,解密.
'XEFEncoder'类实现'Encoder'接口类,用于XEF格式数据加密.
'XEFDecoder'类实现'Decoder'接口类,用于XEF格式数据解密.
'XEFPlugin'类实现'XPlugin'插件接口类,用于注册到XService.
[XEF加密格式说明](./Document/XEFFormat.md).
-----
# XFileEncoder
C#导出API使用`x-encrypt`库进行加密/解密
# 使用方法
使用 Visual Studio 打开`./C#/XFileEncoder.sln`工程
编译并测试
打开`C#/XFileEncoder/Properties/launchSettings.json`文件
修改`commandLineArgs` 命令行参数测试加密/解密功能
```
Usage:
XFileEncoder command args
command:执行命令,必须参数
encrypt:加密命令
decrypt:解密命令
args:命令参数
-load:加载欲加密文件,必须参数
-out:输出文件名字.可选参数,默认文件名out.xfe
-encrypt-size:加密数据长度,可选参数,默认16字节. 取值范围:Min(Clamp(encrypt-size, 1, 255), file_size)
-encode-type:加密源数据方式,可选参数. none:只加密源文件内容, 默认;zip:加密并zip压缩源文件内容
-help:查看帮助
例:
加密:
XFileEncoder encrypt -load test.png -out test.png -encrypt-size 32 -encode-type zip
解密:
XFileEncoder edcrypt -load test.png -out test.png
```
# Unity插件
基于`x-encrypt`库和C#`XFileEncoder`,实现的Unity插件.
项目地址:[XEncrypt-Unity](https://github.com/Y-way/XEncrypt-Unity)