一、LRC歌词格式
LRC格式是一种常见的歌词文件格式,通常用于音乐播放器同步显示歌曲的歌词。LRC文件与音频文件配合使用,能够根据时间戳实时显示歌词,给用户带来更好的听歌体验。
LRC格式的特点:
-
时间戳:LRC歌词的核心是每行歌词前面的时间戳。时间戳的格式通常为
# 说明 [mm:ss.xx] 其中mm表示分钟,ss表示秒,xx表示百分之一秒(可选)。 # 例子 [00:12.34]这是第一句歌词 [00:15.67]这是第二句歌词 [00:20.12]这是第三句歌词
- 例如:
[01:32.45]这是歌词的第一行
- 例如:
-
歌词内容:每个时间戳后面跟着对应的歌词内容,播放器会在音轨播放到指定时间时显示相应的歌词。
-
文件扩展名:通常为
.lrc
。
000
二、QRC歌词格式
QRC格式是由QQ音乐推出的一种歌词格式,它与LRC格式的区别在于,QRC歌词支持逐字同步,也就是说不仅仅可以同步整行歌词,还可以同步每个字的显示时间。这种格式对于卡拉OK或者想精确显示歌词的场景非常有用。
QRC格式的特点:
- 逐字时间戳:QRC歌词不仅对整行歌词进行时间戳标记,还对每个字进行时间戳标记,能够实现更精细的歌词同步效果。
- 文件扩展名:通常为
.qrc
。 - 格式结构:QRC歌词的格式通常是每行歌词有一个总的时间戳,接着每个字后面带有它的时间戳。
示例:
[0,190]Counting(0,13) (13,13)Stars(26,13) (39,13)-(52,13) (65,13)OneRepublic(78,13) (91,13)((104,13)共(117,13)和(130,13)时(143,13)代(156,13))(169,13)
每个字都有对应的时间戳,播放器可以根据这些时间戳精确地同步每个字。但是网络上的QRC歌词都是加密的,我们需要解密才能获取到示例中的歌词数据。
三、解密QRC
我们本次使用python
进行解密QRC歌词,第一步先从网络接口
获取加密的QRC歌词文本,你可以得到以下加密字符串。
264A31DF04D5D9634C3FC17DB11122CFDD9340C96398D3CFBB81E31E81C1F1A0451EA6DB1D3FA4F32880E8350CD9EEB8ED10E5A6896E672074476251DA1E76C77402397681E38AB50DA30FF2F56E13F2905C2FC3E5FEB75930B3F6B05EC0C8E758EC152F3B2626B9441895E827C4347801C5CBB9D7FEDB97AB9F43AC4F843B80A4ED1D5D8D30FC2AA70BE921FEEF3EDB076459D15D01B5350D70061648ACAB6D873647B48EF1B8AAE3E424CA1C8DE63BB538C60035546FA246C80C4100670049736B5D368390971CDEE0B817FF24D30B7A876A3427D46918080AD9B7B132FCB993BE27A807B3B1DE8648EC43ECEBDF4F77C88CF00B338DF20758736B1CD69DE583ECFCD361F2F6AA0BA4892A84BE9B7471719DBF5ECCD6344DB4937E3A80638FE1EB35D37863DF8D2801CA46AAEA3F9DDDA21BD1240A00F5C22AA70DD52382B0CD021E18FF2084C0E72142A3BEA1035CACB00DA0C36EE90822EC5D1......
使用python
解密该字符串
解密流程主要涉及到 Triple DES 解密 和 zlib 解压缩 两个步骤,大概流程如下:
1. 准备加密数据
- 加密数据通常以十六进制字符串的形式提供。首先,需要将这个十六进制字符串转换为字节数组。
- 使用
binascii.unhexlify()
函数将十六进制字符串转换为字节数组。
encrypted_text_byte = hex_string_to_byte_array(encrypted_lyrics)
2. 初始化 Triple DES 密钥调度表
- Triple DES 加密使用三个不同的 DES 密钥,分别对数据进行三次加密或解密操作。为了提高效率,首先需要为每个密钥生成一个密钥调度表。
triple_des_key_setup()
函数根据密钥和模式(加密或解密)生成密钥调度表。- 这里使用的密钥
QQKey
是一个 24 字节的密钥,它被分为三部分,每部分用于一次 DES 加密解密操作。
QQKey = b"qq_encrypt_key_decode"
schedule = [[[0] * 6 for _ in range(16)] for _ in range(3)]
triple_des_key_setup(QQKey, schedule, DECRYPT)
3. 分块进行 Triple DES 解密
- 数据分为 8 字节一块进行解密。Triple DES 的过程是先对数据进行一次 DES 解密,再加密,最后再解密。
- 使用
triple_des_crypt()
函数对每块数据进行三次 DES 加解密操作。
for i in range(0, len(encrypted_text_byte), 8):
temp = bytearray(8)
triple_des_crypt(encrypted_text_byte[i:i + 8], temp, schedule)
data[i:i + 8] = temp
4. 解压缩解密后的数据
- 解密后的数据可能是经过压缩的,因此需要使用
zlib
库进行解压缩。 sharp_zip_lib_decompress()
函数尝试使用zlib
解压缩数据。如果解压缩成功,则返回解压缩后的数据。
unzip = sharp_zip_lib_decompress(data)
5. 将解压缩后的数据转换为字符串
- 解压缩后的数据通常是以 UTF-8 编码的字符串,因此需要将其转换为字符串格式。
- 使用
decode('utf-8')
将字节数组转换为字符串。
result = unzip.decode('utf-8')
6. 最终得到xml格式的明文
交流讨论
[email protected] 备注(CSDN 加密歌词讨论)
标签:13,QRC,加密,歌词,解密,格式 From: https://blog.csdn.net/weixin_43420255/article/details/142977678