异或加密仅适合简单场景,因不抵抗已知明文攻击且密钥复用即失效;适用于临时隐藏配置、防误操作,而非抵御黑客,安全场景应使用AES。

异或加密为什么只适合“简单场景”
异或加密(XOR)本身不具备密码学安全性,它不抵抗已知明文攻击,密钥一旦重复使用或泄露,整个文件可被瞬间还原。它唯一靠谱的用途是:临时隐藏配置文件、规避基础扫描、防止小白误改文本——不是为了防黑客,而是防手滑和低阶窥探。
真正需要安全存储,请直接上 AES(用 OpenSSL 或 libsodium),别自己造轮子。
用 std::fstream 逐字节异或读写文件
核心逻辑就一行:byte ^ key_byte,但必须注意字节对齐、密钥循环、二进制模式打开——漏掉任一环节都会导致乱码或截断。
- 务必用
std::ios::binary打开文件,否则 Windows 下\r\n会被自动转换,加密后无法还原 - 密钥建议用
std::vector<unsigned char></unsigned>存储,避免std::string遇到\0提前截断 - 密钥长度为 1 时最简单(如
0x5A),但安全性最低;多字节密钥需用index % key.size()循环使用 - 加密和解密函数完全相同——
XOR是自反运算:(a ^ b) ^ b == a
void xor_cipher(const std::string& path, const std::vector<unsigned char>& key) {
std::fstream file(path, std::ios::in | std::ios::out | std::ios::binary);
if (!file.is_open()) return;
file.seekg(0, std::ios::end);
size_t size = file.tellg();
file.seekg(0);
std::vector<char> buf(size);
file.read(buf.data(), size);
for (size_t i = 0; i < size; ++i) {
buf[i] ^= key[i % key.size()];
}
file.clear();
file.seekp(0);
file.write(buf.data(), size);
file.close();
}
常见错误:加密后文件打不开 / 内容损坏
这不是算法错了,几乎全是 I/O 模式或缓冲区处理翻车:
立即学习“C++免费学习笔记(深入)”;
- 用
std::ifstream+std::ofstream分开读写?中间没清空file.clear(),第二次操作会失败 - 没调
file.seekg(0)就直接read(),读出来是空的 - 密钥含非 ASCII 字符(比如从命令行传入带中文的字符串),实际存进
vector的是 UTF-8 多字节,导致循环错位 - 对文本文件加密后用记事本打开显示乱码——正常,它本来就是二进制数据;用十六进制编辑器看才对
密钥怎么传才不至于“写死在代码里”
硬编码密钥等于没加密。生产环境至少做到密钥与代码分离:
- 从环境变量读:
getenv("ENCKEY"),启动前export ENCKEY="0x1F,0x3C" - 从独立配置文件读(该文件权限设为
600),且配置文件路径不写死,通过启动参数传入 - 若必须嵌入代码,把密钥拆成多个
const变量+异或拼接,增加静态分析难度(仅防浅层逆向) - 绝对不要用时间戳、PID 等可预测值当密钥——它们不是随机源
异或加密真正的复杂点不在算法,而在于密钥生命周期管理:你得确保加解密两端用的是同一份密钥字节序列,且没人能从内存 dump 里轻易抠出来——这已经超出单个 XOR 调用的范畴了。



















