该帖转载于孤心浪子--http://www.cnblogs.com/KMBlog/p/6877752.html
酷狗音乐上的一些歌曲是不能免费下载的,然而用户仍然可以离线试听,这说明有缓存文件,并且极有可能被加密了.
解密算法:
class Program
{
static void Main(string[] args)
{
byte[] key={0xAC,0xEC,0xDF,0x57};
using (var input = new FileStream(@"E:\KuGou\Temp\***.kgtemp", FileMode.Open, FileAccess.Read))
{
var output = File.OpenWrite(@"E:\KuGou\***.mp3");//输出文件
input.Seek(1024, SeekOrigin.Begin);//跳过1024字节的包头
byte[] buffer = new byte[key.Length];
int length;
while((length=input.Read(buffer,0,buffer.Length))>0)
{
for(int i=0;i<length;i++)
{
var k = key[i];
var kh = k >> 4;
var kl = k & 0xf;
var b = buffer[i];
var low = b & 0xf ^ kl;//解密后的低4位
var high = (b >> 4) ^ kh ^ low & 0xf;//解密后的高4位
buffer[i] = (byte)(high << 4 | low);
}
output.Write(buffer, 0, length);
}
output.Close();
}
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
结果:输出文件的MD5与缓存文件名相同,大功告成
总结
固定要异或的key={0xAC,0xEC,0xDF,0x57}
加密方式如下:
1.设输入的数为x,输出结果为y,循环变量为i;
2.分别取x的高4位和低4位h,l; h=x >> 4 ; l=x & 0xf;
3.分别取key[i]的高4位和低4位kh,kl;kh=key[i] >> 4;kl=key[i] & 0xf;
4.y=h ^ l ^ kh;
5.y=y<< 4 | (l ^ kl);
解密方式如下:
1.设输入的数为x,输出结果为y,循环变量为i;
2.分别取x的高4位和低4位h,l;h=x >> 4 ; l=x & 0xf;
3.分别取key[i]的高4位和低4位kh,kl;kh=key[i] >> 4;kl=key[i] & 0xf;
4.y=l ^ kl;
5.y=(h ^ kh ^ y)<<4 | y;