异或加密仅适合简单场景,因不抵抗已知明文攻击且密钥复用即失效;适用于临时隐藏配置、防误操作,而非抵御黑客,安全场景应使用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
<h3>常见错误:加密后文件打不开 / 内容损坏</h3>
<p>这不是算法错了,几乎全是 I/O 模式或缓冲区处理翻车:</p>
<ul>
<li>用 <code>std::ifstream</code> + <code>std::ofstream</code> 分开读写?中间没清空 <code>file.clear()</code>,第二次操作会失败</li>
<li>没调 <code>file.seekg(0)</code> 就直接 <code>read()</code>,读出来是空的</li>
<li>密钥含非 ASCII 字符(比如从命令行传入带中文的字符串),实际存进 <code>vector</code> 的是 UTF-8 多字节,导致循环错位</li>
<li>对文本文件加密后用记事本打开显示乱码——正常,它本来就是二进制数据;用十六进制编辑器看才对</li>
</ul>
<h3>密钥怎么传才不至于“写死在代码里”</h3>
<p>硬编码密钥等于没加密。生产环境至少做到密钥与代码分离:</p>
<ul>
<li>从环境变量读:<code>getenv("ENCKEY")</code>,启动前 <code>export ENCKEY="0x1F,0x3C"</code>
</li>
<li>从独立配置文件读(该文件权限设为 <code>600</code>),且配置文件路径不写死,通过启动参数传入</li>
<li>若必须嵌入代码,把密钥拆成多个 <code>const</code> 变量+异或拼接,增加静态分析难度(仅防浅层逆向)</li>
<li>绝对不要用时间戳、PID 等可预测值当密钥——它们不是随机源</li>
</ul>
<p>异或加密真正的复杂点不在算法,而在于密钥生命周期管理:你得确保加解密两端用的是同一份密钥字节序列,且没人能从内存 dump 里轻易抠出来——这已经超出单个 <code>XOR</code> 调用的范畴了。</p></char></unsigned>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











