一、介绍
加密与解密涉及到的都是一些算法相关的知识,这里也不打算过多探讨,只简单介绍两种非常简单的字节加密算法。
一种是取反加密、另外一种是异或加密.
网易云的音乐缓存文件至今仍然使用的是异或加密,所以我们可以根据异或算法的原理,直接从网易云音乐缓存文件中将音乐解密出来。
二、取反加密
取反加密的原理非常的简单,就是将一个字节进行取反。
比如字符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
,加密后数据保存的文件。 - 只要
fin
与fout
没有错误,便一直循环,从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
进行异或,异或操作符号为 ^
,当然你也完全可以替换为自己的数字
四、解密网易云
网易的音乐缓存文件便采用的异或加密算法。
为什么如此肯定呢?因为其缓存文件中存在大量相同的字符:
一般来说,一个正常的文件中存在最多的字符应该就是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文件即可,音乐缓存路径可以在网易云软件下面这个位置找到:
解密后其中的.uc
文件,保存为mp3
文件,然后用音乐软件就能打开播放了。
为什么我知道它是MP3文件呢?因为如今的音乐文件中,mp3格式最为普遍。
除此之外,我们还可以从解密后的文件头中看到ID3
等文件头,这是mp3
音乐文件的标头: