加密onnx模型和解密读取onnx模型示例:
//加密模型
#ifdef WINVER
void encryptDecrypt(const wchar_t* toEncrypt, int strLength, const wchar_t* key, wchar_t* output)
{
int keyLength = wcslen(key);
for (int i = 0; i < strLength; i++)
{
output[i] = toEncrypt[i] ^ key[i % keyLength];
}
}
#else
void encryptDecrypt(const char* toEncrypt, int strLength, const char* key, wchar_t* output)
{
int keyLength = strlen(key);
for (int i = 0; i < strLength; i++)
{
output[i] = toEncrypt[i] ^ key[i % keyLength];
}
}
#endif
int main()
{
bool bRet = true;
std::string model_path = "11.onnx";
FILE *pModel1File = fopen(model_path.c_str(), "rb");
if (NULL == pModel1File)
{
bRet = false;
}
int length = 0;
fseek(pModel1File, 0, SEEK_END);
length = ftell(pModel1File);
fseek(pModel1File, 0, SEEK_SET);
ORTCHAR_T* model1rbuffer = nullptr;
model1rbuffer = new ORTCHAR_T[length];
if (nullptr == model1rbuffer) {
bRet = false;
}
fread((ORTCHAR_T *)model1rbuffer, 1, length, pModel1File);
fclose(pModel1File);
//写入加密模型
FILE *pOutFile = fopen("1.data", "wb");
if (NULL == pOutFile)
{
return -1;
}
#ifdef WINVER
const wchar_t* key = L"1234";
const wchar_t* encrypted = new wchar_t[length];
#else
const char* key = "1234";
const char* encrypted = new char[length];
#endif
encryptDecrypt(model1rbuffer, length, key, encrypted);
fwrite(encrypted, 1, length, pOutFile);
fclose(pOutFile);
delete[] encrypted;
delete[] model1rbuffer;
system("pause");
return 0;
}
// 解密模型加载
int main()
{
bool bRet = true;
std::string model_path = "1.data";
FILE *pModel1File = fopen(model_path.c_str(), "rb");
if (NULL == pModel1File)
{
bRet = false;
}
int length = 0;
fseek(pModel1File, 0, SEEK_END);
length = ftell(pModel1File);
fseek(pModel1File, 0, SEEK_SET);
ORTCHAR_T* model1rbuffer = nullptr;
model1rbuffer = new ORTCHAR_T[length];
if (nullptr == model1rbuffer) {
bRet = false;
}
fread((ORTCHAR_T *)model1rbuffer, 1, length, pModel1File);
fclose(pModel1File);
#ifdef WINVER
const wchar_t* key = L"1234";
const wchar_t* encrypted = new wchar_t[length];
#else
const char* key = "1234";
const char* encrypted = new char[length];
#endif
encryptDecrypt(model1rbuffer, length, key, decrypted);
const OrtApi* g_ort = OrtGetApiBase()->GetApi(ORT_API_VERSION);
OrtEnv* env_;
g_ort->CreateEnv(ORT_LOGGING_LEVEL_WARNING, "cyril", &env_);
OrtSessionOptions* session_options_= nullptr;
OrtSession* session_= nullptr;
g_ort->CreateSessionOptions(&session_options_);
g_ort->SetIntraOpNumThreads(session_options_, 1);
g_ort->SetSessionGraphOptimizationLevel(session_options_, ORT_ENABLE_ALL);
//g_ort->CreateSession(env_, model1rbuffer, session_options_, &session_);
g_ort->CreateSessionFromArray(env_, decrypted, length, session_options_, &session_);
std::cout << "ok!" << std::endl;
delete[] model1rbuffer;
delete[] decrypted;
system("pause");
return 0;
}