赞
踩
对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());
}
}
这里代码的逻辑:
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,那么就无法解密出原有数据
而如果知道了数字二,我们就可以通过同样的方法解密出原有数据:
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文件即可
音乐缓存路径在其设置里面:
解密后,便可以正常播放了:
为什么我知道它是MP3文件呢?因为如今的音乐文件中,mp3格式最为普遍
除此之外,我们还可以从解密后的文件头中看到ID3
等文件头,这是mp3
音乐文件的标头
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。