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