c++怎么实现简单加密算法XOR_c++ 位运算加密与解密原理【案例】


XOR加密本质是利用异或运算的可逆性(a^b^b==a)进行数据混淆,非真正加密算法;它不抗统计分析和已知明文攻击,仅适用于临时遮掩或教学;实现时须用unsigned char处理字节并以密钥长度取模循环。

什么是 XOR 加密的本质

XOR 加密不是真正意义上的加密算法,它只是利用 ^(异或)运算的可逆性做数据混淆。关键在于:a ^ b ^ b == a,所以用同一密钥反复异或就能加解密。它不防统计分析、不抗已知明文攻击,只适合临时遮掩或教学演示。

std::string 实现单字节密钥 XOR 加解密

最常见错误是把密钥当字符串直接循环使用,却忽略空字符 '\0' 导致 std::string::c_str() 提前截断;另一坑是未考虑输入含非 ASCII 字节时,char 有符号性引发高位扩展(如 (signed char)0xFF ^ 0x01 变成 -1 ^ 1,结果意外)。

正确做法:统一用 unsigned char 处理字节,密钥按长度取模循环:

std::string xor_encrypt_decrypt(const std::string& data, const std::string& key) {
    if (key.empty()) return data;
    std::string result = data;
    for (size_t i = 0; i < data.size(); ++i) {
        unsigned char byte = static_cast(data[i]);
        unsigned char k = static_cast(key[i % key.size()]);
        result[i] = static_cast(byte ^ k);
    }
    return result;
}

调用示例:

std::string plain = "Hello, world!";
std::string key = "K";
std::string cipher = xor_encrypt_decrypt(plain, key); // 得到乱码二进制串
std::string restored = xor_encrypt_decrypt(cipher, key); // 恢复为 "Hello, world!"

多字节密钥与避免明文泄露风险

用固定字符串如 "KEY" 当密钥看似增强,实则只要明文开头已知(比如 HTTP 请求以 "GET " 开头),攻击者立刻能反推密钥前 4 字节:cipher[0] ^ 'G'cipher[1] ^ 'E'……进而解出全部内容。

若真要提升安全性(仍属玩具级),至少做到:

  • 密钥长度 ≥ 明文长度(即“一次一密”原则),但需安全分发密钥
  • 密钥本身由 CSPRNG 生成,不用硬编码字符串
  • 加密后数据不能以文本形式打印或记录——std::string 可能含 \0 或控制字符,std::cout 会提前终止

实际调试时,建议用十六进制打印:

for (unsigned char c : cipher) {
    std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)c << " ";
}

为什么不能直接对 std::string 调用 ^ 运算符

std::string 没有重载 ^ 运算符,C++ 不允许对类类型隐式转为字节数组再逐位异或。有人误写 str1 ^ str2 会编译失败;也有人试图用 reinterpret_cast 强转指针去操作内存,这在小端/大端、对齐、string 的 SSO(短字符串优化)实现下极易崩溃或读越界。

必须显式遍历每个字节,且确保访问的是真实数据起始地址:&data[0]data.data()(C++11 起保证返回连续内存)。

SSO 特别容易被忽略:短字符串(如小于 15 字节)可能不堆分配,但 data.data() 依然有效;而直接取 &data[0] 在空字符串时是未定义行为,应先判空。

XOR 加解密逻辑极简,但落地时字节类型、边界、输出处理三处最容易出错。别把它当生产环境加密用,也别因“能还原”就误以为安全。


# 编码  # 字节  # ai  # c++  # red  # String  # 字符串  # char  # 循环  # ASCII  # 算法  # http  # 加密算法  # 加解密  # 多字  # 的是  # 运算符  # 就能  # 遍历  # 适用于  # 把它  # 并以  # 这在 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: php在Linux怎么部署_LNMP环境搭建PHP服务的详细指南【指南】  Windows 10怎么把任务栏放在屏幕上方_Windows 10解锁任务栏并拖动位置  如何在JavaScript中动态拼接PHP的base_url与JS变量  MAC怎么在照片中添加水印_MAC自带编辑工具文字水印叠加【方法】  如何在 ACF 中正确更新嵌套多层 Group 字段内的子字段  如何在Golang中编写端到端测试_Golang E2E测试流程示例  c++ stringstream用法详解_c++字符串与数字转换利器  如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题  c++获取当前时间戳_c++ time函数使用详解  Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】  如何使用Golang读取日志文件_Golang bufio Scanner日志处理示例  php删除数据怎么软删除_添加is_del字段标记删除【技巧】  Windows7如何安装系统镜像_Windows7系统安装教程【步骤】  Win11视频默认播放器怎么改_Win11关联第三方播放器【步骤】  Win11怎么查看局域网电脑_Windows 11网络邻居发现设置【技巧】  c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】  Win11怎么更改文件夹图标_自定义Win11文件夹外观样式【详解】  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  Python实现图数据库操作_Neo4j核心CRUD与图算法解析  Win10如何卸载微软拼音输入法 Win10只保留一个输入法【教程】  Win11怎么设置默认PDF阅读器 Win11修改PDF打开方式【步骤】  LINUX下如何配置VLAN虚拟局域网_在LINUX交换机与服务器上的实现  Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】  php查询数据怎么导出csv_查询结果转csv文件保存【操作】  如何使用Golang实现基本类型比较_Golang比较操作符使用方法  微信短链接怎么还原php_用浏览器开发者工具抓包获取【方法】  PythonPandas数据分析教程_数据清洗与处理技巧  Win11怎么关闭自动维护 Win11禁用系统自动维护功能【优化】  c++中explicit(bool)的用法 c++条件性explicit【C++20】  Win11怎么关闭OneDrive同步_Win11取消自动备份文件【教程】  如何在Golang中指定模块版本_使用go.mod控制版本号  Mac如何设置动态壁纸?(让桌面动起来)  Python列表推导式与字典推导式教程_简化代码高效写法  Windows10如何更改桌面背景_Win10个性化幻灯片放映设置  如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  Win11怎么硬盘分区 Win11新建磁盘分区详细教程【步骤】  Python代码测试策略_质量保障解析【教程】  Windows10如何删除Windows.old_Win10磁盘清理系统文件选项  如何在Golang中写入JSON文件_保存结构体数据到文件  Windows10系统怎么查看硬盘健康_Win10 SMART信息检测工具  Win11怎么清理C盘系统错误报告_Win11清理系统错误报告技巧【教程】  如何用::实现单例模式_php静态方法与作用域操作符应用【技巧】  如何使用Golang实现错误包装与传递_Golangfmt.Errorf%w使用实践  php订单日志怎么按金额排序_php按订单金额排序日志方法【方法】  c++中的可变参数模板(variadic templates)怎么用_c++模板编程黑魔法【C++11】  c++中如何使用auto关键字_c++11类型推导用法说明  PHP接收参数值为空怎么办_判断和处理空参数方法说明【说明】  Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置  Linux如何安装Golang环境_Linux下Go语言开发包配置【方法】 

 2026-01-03

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.