已实现,python解密QRC歌词,加密歌词,解密

一、LRC歌词格式

LRC格式是一种常见的歌词文件格式,通常用于音乐播放器同步显示歌曲的歌词。LRC文件与音频文件配合使用,能够根据时间戳实时显示歌词,给用户带来更好的听歌体验。

LRC格式的特点:
  1. 时间戳:LRC歌词的核心是每行歌词前面的时间戳。时间戳的格式通常为

    # 说明
    [mm:ss.xx]  其中mm表示分钟,ss表示秒,xx表示百分之一秒(可选)。
    # 例子
    [00:12.34]这是第一句歌词
    [00:15.67]这是第二句歌词
    [00:20.12]这是第三句歌词
    
    • 例如:[01:32.45]这是歌词的第一行
  2. 歌词内容:每个时间戳后面跟着对应的歌词内容,播放器会在音轨播放到指定时间时显示相应的歌词。

  3. 文件扩展名:通常为.lrc

000

二、QRC歌词格式

QRC格式是由QQ音乐推出的一种歌词格式,它与LRC格式的区别在于,QRC歌词支持逐字同步,也就是说不仅仅可以同步整行歌词,还可以同步每个字的显示时间。这种格式对于卡拉OK或者想精确显示歌词的场景非常有用。

QRC格式的特点:
  1. 逐字时间戳:QRC歌词不仅对整行歌词进行时间戳标记,还对每个字进行时间戳标记,能够实现更精细的歌词同步效果。
  2. 文件扩展名:通常为.qrc
  3. 格式结构: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格式的明文

image-20241016114202488


交流讨论

yufirem@vip.qq.com 备注(CSDN 加密歌词讨论)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值