XOR加密不等于安全加密,因其无扩散无混淆、密钥复用即泄密;C++递归加解密需用std::filesystem遍历、二进制分块处理、动态密钥循环异或,禁用全文件加载。

为什么用异或(XOR)加密文件夹内容不等于“安全加密”
异步加解密本身不提供保密性保障,xor 是可逆、无扩散、无混淆的位运算,密钥一旦重复使用或泄露,明文会直接暴露。它只适合临时脱敏、开发环境快速翻转数据、或作为多层加密中的一环。生产环境必须用 AES、ChaCha20 等标准算法。
如何用 C++ 递归遍历并逐文件 xor 加解密(含路径处理)
核心是避免硬编码路径分隔符、忽略隐藏文件、跳过无法打开的文件(如符号链接、权限不足),同时保持原始目录结构不变。关键点:
-
std::filesystem::recursive_directory_iterator是 C++17 起的标准方案,比手动opendir更可靠 - 对每个
regular_file打开后用std::ios::binary模式读写,否则 Windows 下换行符会被误改 - 密钥建议用
std::vector<uint8_t></uint8_t>存储,长度任意,实际使用时按字节循环异或:buf[i] ^= key[i % key.size()] - 不要对整个文件一次性
read到内存——大文件(>100MB)易 OOM;用 64KB 缓冲区分块处理
示例片段(加解密逻辑相同,仅输入输出路径互换):
void xor_file(const std::string& in_path, const std::string& out_path,
const std::vector<uint8_t>& key) {
std::ifstream fin(in_path, std::ios::binary);
std::ofstream fout(out_path, std::ios::binary);
std::vector<char> buf(65536);
size_t key_idx = 0;
while (fin.read(buf.data(), buf.size())) {
size_t n = fin.gcount();
for (size_t i = 0; i < n; ++i) {
buf[i] ^= key[key_idx++ % key.size()];
}
fout.write(buf.data(), n);
}
// 处理剩余不足一整块的部分
if (fin.gcount() > 0) {
size_t n = fin.gcount();
fin.read(buf.data(), n);
for (size_t i = 0; i < n; ++i) {
buf[i] ^= key[key_idx++ % key.size()];
}
fout.write(buf.data(), n);
}
}
遇到 “Permission denied” 或 “Operation not permitted” 怎么办
常见于 macOS 的 __MACOSX 元数据目录、Linux 的 /proc 或 /sys 挂载点、Windows 的 $RECYCLE.BIN。不是 bug,是预期行为。处理方式:
立即学习“C++免费学习笔记(深入)”;
- 捕获
std::filesystem::filesystem_error,检查.code().value()是否为EACCES或EPERM - 跳过该 entry,继续迭代(用
try { ... } catch (...) { continue; }包裹单次操作) - 不尝试
chmod或chown—— 用户没给权限,程序不该越权 - 注意:某些 FAT32/UFS 文件系统不支持
last_write_time,调用时也可能抛异常,同样跳过即可
加解密后文件大小变化?校验与覆盖风险怎么控
XOR 不改变文件体积,所以加密前后 file_size 必须一致。但实操中容易踩两个坑:
- 输出路径和输入路径相同 → 导致边读边写,文件被截断。务必先写入临时路径(如
in_path + ".tmp"),成功后再std::filesystem::rename - 没校验写入是否完整 → 某些磁盘满或权限突变时,
fout.write可能失败但不报异常。每次写完要检查fout.good() && fout.tellp() == expected_pos - 想验证加解密正确性?不需要重读全文件比对,只需对原始文件和解密后文件各取一个固定 offset(如 0 和末尾 1KB)做
memcmp即可
真正的麻烦在于:你没法靠 XOR 判断“解密是否成功”。它永远能解出一个看似合理的文件——哪怕密钥错了。这个特性常被忽略,但它决定了 XOR 不能用于需要完整性/认证的场景。



















