XOR加密仅适用于非敏感场景,因不安全且不合规;正确实现需密钥非空、循环取模、用unsigned char处理字节,加解密逻辑相同,且不可用于密码等敏感数据。

加密前先确认:你真的需要“自己写加密”吗?
绝大多数场景下,std::string 不该用自定义算法加密——它既不安全也不符合合规要求。如果你只是想防配置文件明文、临时混淆日志或教学演示,才考虑简单变换;如果是密码、token、用户数据,必须用 libsodium 或系统级 OpenSSL 的 AES/GCM 实现。
最常用且安全的“简单”做法:用 XOR 加密(仅限非敏感场景)
XOR 是唯一可逆、无额外依赖、能手写且不易出错的位运算方案。但注意:key 长度必须与明文一致(或循环复用),否则会暴露统计特征。
- 用
std::string存原始文本和密钥,逐字节异或:std::string encrypt_xor(const std::string& s, const std::string& key) { std::string out = s; for (size_t i = 0; i < s.size(); ++i) { out[i] = s[i] ^ key[i % key.size()]; } return out; } - 解密函数完全一样,因为
a ^ b ^ b == a - 错误示范:
key为空 → 触发key[i % 0]除零崩溃 - 性能影响:几乎为零,纯内存操作;但输出含不可见字符(如
\x00),不能直接打印或存为 UTF-8 文本
别踩这个坑:用 std::rotl 或移位当加密
C++20 引入了 std::rotl(循环左移),有人试图用它替代 XOR。问题在于:
- 单纯移位不具备密钥混淆能力,频率分析极易还原
-
std::rotl只对整数类型定义,对char必须显式转成unsigned char再转回,否则符号扩展导致结果错乱 - 示例错误写法:
out[i] = std::rotl(s[i], 3);——s[i]是signed char,负值移位行为未定义
如果必须支持中文或 Unicode 字符串
std::string 本质是字节容器,UTF-8 编码下中文占 3 字节。XOR 加密仍可工作,但需确保:
立即学习“C++免费学习笔记(深入)”;
- 密钥也按字节处理(不要按“字符”切分)
- 不在加密后调用
.c_str()然后传给 C 风格字符串函数(遇到\x00就截断) - 日志或调试时用十六进制打印:
printf("%02x ", (unsigned char)c);
真正麻烦的不是加密本身,而是后续怎么安全地保存密钥、怎么避免密文被意外截断、以及如何向协作方解释“这根本不算加密”。


















