讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何实现简单的文件加密工具_XOR异或算法逐字节处理【实战】

冬辰姑娘_1003

冬辰姑娘_1003

发布时间:2026-03-25 19:13:50

|

897人浏览过

|

来源于php中文网

原创

XOR加密仅适合教学或临时混淆,因其无密钥派生、无扩散、无完整性校验,易受频率分析和已知明文攻击;实际安全场景应使用libsodium等成熟库。

c++如何实现简单的文件加密工具_xor异或算法逐字节处理【实战】

为什么 XOR 加密在 C++ 里“看起来能用”,但实际只适合教学或临时场景

因为 XOR 是对称、无密钥派生、无扩散的纯位运算,key 一旦重复使用或过短,密文就容易被频率分析或已知明文攻击还原。它不提供完整性校验,也无法抵抗主动篡改——加密后文件被改一个字节,解密时只会对应位置错一个字节,毫无告警。

所以别拿它保护密码文件或配置项;真有安全需求,请直接上 libsodium 或系统级 API(如 Windows CryptProtectData)。

但如果你只是想快速加个壳防小白双击查看,或者做嵌入式日志混淆,XOR 确实够轻、够快、够直白:

  • 无需额外依赖,标准 fstream + char 运算就能跑
  • 加密/解密逻辑完全一致:byte ^ key_byte
  • 单字节 key 最简,多字节 key 需循环异或(常见坑:忘记取模导致越界)

如何用 std::fstream 安全读写二进制文件(避免文本模式换行截断)

Windows 下默认 std::ofstream 是文本模式,遇到 \x0A 可能被悄悄转成 \x0D\x0A,导致加密后文件体积变大、内容错位。必须显式指定 std::ios::binary。

立即学习“C++免费学习笔记(深入)”;

实操建议:

  • 打开输入文件用:std::ifstream in(path, std::ios::binary)
  • 打开输出文件用:std::ofstream out(path, std::ios::binary)
  • 检查是否成功:if (!in.is_open()) { /* 报错 */ },别只靠 good()
  • 读取推荐用 std::vector<char></char> 一次性载入(小文件)或分块 read()(大文件),避免 >> 流运算符自动跳过空白

key 循环异或的边界处理(最容易崩在最后一个字节)

用字符串当密钥(比如 "secret")时,必须对每个字节位置计算 key[i % key_len]。常见错误是手写 for 循环却忘了 %,或者把 key_len 算成 strlen(key) 却没考虑 <p>用字符串当密钥(比如 <code>"secret")时,必须对每个字节位置计算 key[i % key_len]。常见错误是手写 for 循环却忘了 %,或者把 key_len 算成 strlen(key) 却没考虑 \0——C++ 里 std::string 的 .size() 才是真实长度。

——C++ 里 std::string 的 .size() 才是真实长度。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

示例片段(安全写法):

std::string key = "abc";
size_t key_len = key.size(); // 不是 key.length() + 1
for (size_t i = 0; i < data.size(); ++i) {
    data[i] ^= key[i % key_len]; // 必须取模,否则越界
}

如果 key 是单字节(如 char key = 0x55),就不用循环,直接 data[i] ^= key —— 更快,也更难被猜出规律。

加密后文件头损坏?小心 BOM 和可执行文件签名

对 UTF-8 文本加完 XOR,再用记事本打开可能显示乱码甚至报错,不是算法问题,是记事本强行按 UTF-8 解码带 BOM 的文件。XOR 不区分内容类型,它会照常加密 BOM 字节(\xEF\xBB\xBF),导致解密后 BOM 错乱。

更隐蔽的坑在 PE 文件(.exe)、ELF(Linux 可执行文件)或 ZIP 包:它们头部有固定 magic bytes(如 ZIP 是 \x50\x4B\x03\x04)。若加密破坏了这些字段,系统直接拒绝加载或解压——这不是 bug,是你本就不该拿 XOR 去碰这类结构化二进制。

对策很简单:

  • 加密前先确认目标文件类型:file -i filename(Linux/macOS)或看扩展名+属性
  • 若必须处理可执行文件,加密前跳过前 N 字节(如跳过 ZIP 的 4 字节 header),但解密时得同步跳过——这已脱离“简单工具”范畴
  • 日常建议:只加密纯文本、日志、配置等无格式要求的文件

真正麻烦的从来不是怎么写那几行 ^,而是你根本没意识到:加密之后,谁来保证别人拿到文件还能正确识别它的原始类型和用途。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6719

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3124

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1832

2025.10.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2844

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5929

2023.11.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn