16.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());
	}
}

简单说一下这里代码的逻辑:

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

三、异或加密

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

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

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

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

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

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

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

如果别人不知道我们这个数字2,那么就无法解密出原有数据,但如果知道了数字2,我们就可以通过同样的方法解密出原有数据:

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

只要知道这个数字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);
	}
}

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

这里是与 0x20进行异或,异或操作符号为 ^,当然你也完全可以替换为自己的数字

四、解密网易云

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

为什么如此肯定呢?因为其缓存文件中存在大量相同的字符:

image-20231130135419024

一般来说,一个正常的文件中存在最多的字符应该就是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);
	}
}

将其保存一个mp3文件即可,音乐缓存路径可以在网易云软件下面这个位置找到:

image-20231130135235857

解密后其中的.uc文件,保存为mp3文件,然后用音乐软件就能打开播放了。

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

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

image-20231130135754254

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux