2026-01-02 20:00:18 +01:00
|
|
|
|
#pragma once
|
2025-05-27 04:15:35 +08:00
|
|
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
// Encode for IP and Port.
|
|
|
|
|
|
// provided by ChatGPT.
|
2025-10-15 04:32:59 +08:00
|
|
|
|
class StreamCipher
|
|
|
|
|
|
{
|
2025-05-27 04:15:35 +08:00
|
|
|
|
private:
|
2025-10-15 04:32:59 +08:00
|
|
|
|
uint32_t state;
|
2025-05-27 04:15:35 +08:00
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 简单非线性伪随机数生成器
|
2025-10-15 04:32:59 +08:00
|
|
|
|
uint8_t prngNext()
|
|
|
|
|
|
{
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 例子:xorshift32,改造一点非线性
|
2025-10-15 04:32:59 +08:00
|
|
|
|
state ^= (state << 13);
|
|
|
|
|
|
state ^= (state >> 17);
|
|
|
|
|
|
state ^= (state << 5);
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 再混合一个简单的非线性变换
|
2025-10-15 04:32:59 +08:00
|
|
|
|
uint8_t out = (state & 0xFF) ^ ((state >> 8) & 0xFF);
|
|
|
|
|
|
return out;
|
|
|
|
|
|
}
|
2025-05-27 04:15:35 +08:00
|
|
|
|
|
|
|
|
|
|
public:
|
2025-10-15 04:32:59 +08:00
|
|
|
|
StreamCipher(uint32_t key) : state(key) {}
|
2025-05-27 04:15:35 +08:00
|
|
|
|
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 加密解密(对称,长度不变)
|
2025-10-15 04:32:59 +08:00
|
|
|
|
void process(uint8_t* data, size_t len)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (size_t i = 0; i < len; ++i) {
|
|
|
|
|
|
data[i] ^= prngNext();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-05-27 04:15:35 +08:00
|
|
|
|
};
|
2025-06-19 17:50:11 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
class PrintableXORCipher
|
|
|
|
|
|
{
|
2025-06-19 17:50:11 +08:00
|
|
|
|
public:
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 对称加解密,输入和输出均为可打印字符
|
|
|
|
|
|
// 前提:输入是32~126范围的字符
|
2025-10-15 04:32:59 +08:00
|
|
|
|
void process(char* data, size_t len)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (size_t i = 0; i < len; ++i) {
|
|
|
|
|
|
char c = data[i];
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 保证输入字符是可打印范围
|
2025-10-15 04:32:59 +08:00
|
|
|
|
if (c < 32 || c > 126) {
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 不处理非打印字符(或者你也可以自定义错误处理)
|
2025-10-15 04:32:59 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 异或0x55('U')且确保结果仍是32~126之间
|
2025-10-15 04:32:59 +08:00
|
|
|
|
char encrypted = c ^ 0x55;
|
2026-01-02 20:00:18 +01:00
|
|
|
|
// 如果不在范围,修正回范围内(简单加减循环)
|
2025-10-15 04:32:59 +08:00
|
|
|
|
if (encrypted < 32) encrypted += 95;
|
|
|
|
|
|
if (encrypted > 126) encrypted -= 95;
|
|
|
|
|
|
data[i] = encrypted;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-06-19 17:50:11 +08:00
|
|
|
|
};
|