当前位置:   article > 正文

C/C++实现文件加密器_c++加密文件

c++加密文件

前言

对C/C++学习感兴趣的可以看看这篇文章噢:C/C++教程

一、介绍

算法是一个很复杂的领域,这里介绍两种非常简单的字节加密算法,一种是取反加密,一种是异或加密

网易云的音乐缓存文件至今仍然使用的是异或加密,可以便可以根据异或算法的原理,直接从网易云音乐缓存文件中将音乐解密出来

二、取反加密

取反加密的原理非常的简单,就是将一个字节进行取反

比如我的数字1,其ASCII码值为49,换算为二进制为:0011 0001

那么取反后,其值就成为了 :1100 1110

该值首位为1,即为负数,超出了ASCII码表的范围,显示的便是乱码

而想要将其还原也很简单,再对其取反一次即可

实现代码如下:

#include<iostream>
#include<fstream>
using namespace std;
int main() {
	string str = "tmp.txt";
	ifstream fin(str,ios::binary);
	ofstream fout(str+".txt", ios::binary);
	while (fin.good() && fout.good()) {
		fout.put(~fin.get());
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里代码的逻辑:

  • 用二进制读方法打开文件tmp.txt,(读取要进行加密的文件)
  • 用二进制写方式打开文件 tmp.txt.txt,(加密后数据保存的文件)
  • 只要finfout没有错误,便一直循环,从fin中取出一个字节,使用取反运算符~取反后,写入fout

三、异或加密

上面的取反加密还是过于简单了,因为其没有任何额外的信息加入,别人只要看出一点媏疑,就能很快解开

所以这里再介绍另一个常用的算法,即异或加密

还是上面的字符1,其二进制为:0011 0001

现在我自己给出一个数字2,其二进制为: 0000 0010

当上面两个数字进行异或操作:

0011 0001
0000 0010
----------
0011 0011 //相同为0,不同为1,得到加密后的数据
  • 1
  • 2
  • 3
  • 4

这样我们就得到加密后的数据0011 0011

如果别人不知道我们这个数字2,那么就无法解密出原有数据

而如果知道了数字二,我们就可以通过同样的方法解密出原有数据:

0011 0011
0000 0010
----------
0011 0001 //相同为0,不同为1,得到解密后的数据
  • 1
  • 2
  • 3
  • 4

看!只要知道这个数字2,那么就可以通过同样的算法解密出数据

代码实现如下:

#include<iostream>
#include<fstream>
using namespace std;
int main() {
	string str = "tmp.txt";
	ifstream fin(str,ios::binary);
	ofstream fout(str+".txt", ios::binary);
	while (fin.good() && fout.good()) {
		fout.put(fin.get()^0x20);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

过程与上面的取反加密基本一致,唯一不同的就是,将读出字节取反的操作,改为与一个数字进行异或

这里是与 0x20进行异或,异或操作符号为 ^

四、解密网易云缓存数据文件

网易的音乐缓存文件便采用的异或加密算法

为什么如此肯定呢?因为其缓存文件中存在大量相同的字符
在这里插入图片描述
一般来说,一个正常的文件中存在最多的字符应该就是0了,而网易云音乐缓存文件前面却存在大量的A3

而0与任何数异或都等于原数,所以我们可以合理猜测其采用了异或算法进行加密,而加密的数字就是 A3

所以我们就可以更改一下上面的异或算法代码:

#include<iostream>
#include<fstream>
using namespace std;
int main() {
	string str = R"(C:\Users\yu\AppData\Local\NetEase\CloudMusic\Cache\Cache\1901401124-128-ee0c1d8a2168a04a1af4d9f3f6b309d3.uc)";
	ifstream fin(str,ios::binary);
	ofstream fout("test.mp3", ios::binary);
	while (fin.good() && fout.good()) {
		fout.put(fin.get()^0xA3);
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

将其保存一个mp3文件即可

音乐缓存路径在其设置里面:
在这里插入图片描述

解密后,便可以正常播放了:

在这里插入图片描述

为什么我知道它是MP3文件呢?因为如今的音乐文件中,mp3格式最为普遍

除此之外,我们还可以从解密后的文件头中看到ID3 等文件头,这是mp3音乐文件的标头

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/990885
推荐阅读
相关标签
  

闽ICP备14008679号