QQ音乐中的加密文件
随着互联网越来越重视版权,很多歌都要付费成为对应软件的会员才能听,会员过期了就听不了(就算我在会员期间下载了这些歌)。 而且只能在对应的因为软件上听。
以QQ音乐为例,一般情况下,我们在QQ音乐上开通会员后,下载的歌曲格式为qq音乐进行加密过后的格式。
所以市面上有很多对QQ音乐加密后的歌曲进行解密的软件,那么如果有需求让我们来做对音乐解密然后播放,那应该怎么做?
unlock-music
github上其以前有一个很完善的项目https://github.com/unlock-music/unlock-music ,开源了QQ音乐、网易云音乐等国内几乎所有音乐的解密。后来由于被DMCA申述了,作者也下架了所有相关代码。之前好奇看了一下源码,发现不论是那个厂商的音乐,加解密原理都差不多。
加解密原理。
要想解密,我们肯定要先知道加密。 大家如果刷过面试题,一般会遇到一个简单难度的算法题“有N多个数,里面的数两两成对,值都一样。现在混入了一个数,找出这个数是多少。例如1,2,1,2,3,3,4,5,4,里面单独的数就是5”。我们的解法一般就是aba = b这种方式。
同样,我们利用异或算法这种独特的特性也能很快的对文件进行加密和解密了。
我们知道一个任何文件,在底层都是二进制的。所以我们把文件通过js 转换为ArrayBuffer, 然后读取为uint8格式的无符号8位整形数组。我们在用我们的秘钥依次对这个数组的每一位进行异或, 得到一个新的无符号8位整形数组。最后再把新的数组转换为文件。这样新的文件就是加密后的文件,但是文件大小不会变。 这个过程 我们可以看做 a ^ b => c.
解密就和前面的加密过程一样了。 即 c ^ b => a
注意,在实际情况中,秘钥一般都是多个unicode这组成的数组。加密的时候按照一定规则取数组中的某一位作为秘钥。
为什么秘钥不是动态的
这里我们可以看到,对文件的加密最重要的是秘钥不能丢。但是在QQ音乐这个场景下,要保证之前下载的加密歌曲能正常播放,秘钥是不能动态变化的。一般情况下,也不适合直接在代码中写一个固定字符串作为秘钥,毕竟容易泄露。所以有部分音频加密的秘钥用的是一些固定的算法,例如取需要被加密文件的固定某些位,再加上一些内置的秘钥统一生成一个新的秘钥。
秘钥是如何被拿到的
这个我也不清楚,反编译,抓包,开发人员离职记下来带走了都可能吧。防止秘钥的丢失还不如通过法律手段维护来得直接。
最后
虽然现在因为版权问题很多歌不能听给我们带来了很多的不便,但是作为一个合法公民遵守法律的义务,所以大家有条件还是听正版歌曲或者免费歌曲吧。