ali-player-decrypt.
AliyunVodEncryption加密分析
阿里云点播API文档地址
预定义伪代码
covert
|
AES
//AES加密,模式为CBC,填充方式:PKCS5Padding |
返回参数说明
PlayInfoList.PlayInfo[0]
{ |
逻辑分析
假设视频文件的AES key 为 realKey
浏览器生成一个随机串 r1 利用RSA公钥加密,结果为randStr
服务器接受到randStr,利用私钥解密出随机串 r1
把r1利用MD5生成数字摘要,再截取(8,24)位的字符串 记为rs1
convert(rs1)得到第一段加密的IV和KEY,记为KEY1,IV1
再生成一段随机字符串记为r2,利用AES.encrypt(r2,KEY1,IV1) 得到上面返回结果中的 Rand
拼接r1 + r2,利用MD5生成数字摘要,再截取(8,24)为的字符串,记为rs2
convert(rs2)得到第二段加密的KEY,记为KEY2
利用AES.encrypt(realKey,KEY2,IV1) 得到上面返回的结果Plaintext
至此,整个加密逻辑分析完毕
解密TS文件
用到的工具EasyICE,DVB Inspector,tsduck
ts-header(32byte)
| 字段名 | 位数 | 说明 |
|---|---|---|
| sync_byte | 4bit |
TS package 标识,固定值0x47 |
| transport_error_indicator | 1bit |
传输错误标识 |
| payload_unit_start_indicator | 1bit |
PES包开始标识,可以用掩码0x40 判断 |
| transport_priority | 1bit |
传输优先级 |
| PID | 13bit |
TS package identity 0x100:视频数据,0x101:音频数据, -1:id3Track,应该从PMT表中查找 |
| transport_scrambling_control | 2bit |
是否有干扰码 |
| adaptation_field_control | 2bit |
是否有扩展字段,0x01:payload only,0x02:adaptation field only,0x03:adaptation field follow payload |
| continuity_counter | 4bit |
pack seq |
var data = [] |
reference
https://gist.github.com/manyuanrong/39f151181a193b454c3b11dac1b60e15#file-jsencrypt-js
https://g.alicdn.com/de/prismplayer/2.9.0/hls/aliplayer-hls-min.js
https://stackoverflow.com/questions/28562894/how-to-loop-an-mpeg-ts-stream