ali-player-decrypt.

AliyunVodEncryption加密分析

阿里云点播API文档地址

GetVideoPlayAuth

GetPlayInfo

预定义伪代码

covert


/**
* @param hexStr 16进制字符串,长度为16
* 把16进制字符串利用base64编码,再解码,得到长度为16的字节数组
*
*/
function convert(hexStr){
return Base64.decode(Base64.encode(str));
}

AES

//AES加密,模式为CBC,填充方式:PKCS5Padding
function AES(){
this.encrypt(content,KEY,IV){
aes.encrypt(content,KEY,IV)
}
}

返回参数说明

PlayInfoList.PlayInfo[0]

{
"Status": "Normal",
"StreamType": "video",
"Rand": "NYspn8Qc220551gz62GCFGeOOU6WxF9nr9e8c64wDbE=", //存储第一段AES key
"Size": 1368828,
"Definition": "LD",
"Fps": "25",
"Duration": "10.0254",
"ModificationTime": "2021-05-11T08:04:11Z",
"Specification": "H264.SD",
"Bitrate": "1092.283",
"Encrypt": 1,//是否加密
"PreprocessStatus": "UnPreprocess",
"Format": "m3u8",
"EncryptType": "AliyunVoDEncryption",//阿里云的私有加密
"PlayURL": "https://vod.domain.com/play.m3u8",
"NarrowBandType": "0",
"Plaintext": "4pccpVV9LIjk9s0gZCFj4t6n85PPlwZuhrL2D4fbJJU=",//存储第二段AES key
"CreationTime": "2021-05-11T08:04:05Z",
"Height": 540,
"Width": 960,
"JobId": "a7a32209e6e3429f99128b25b34a8e40"
}

逻辑分析

假设视频文件的AES keyrealKey

浏览器生成一个随机串 r1 利用RSA公钥加密,结果为randStr

服务器接受到randStr,利用私钥解密出随机串 r1

r1利用MD5生成数字摘要,再截取(8,24)位的字符串 记为rs1

convert(rs1)得到第一段加密的IVKEY,记为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文件

MPEG-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 = []
//当遇到`PUSI(Payload unit start indicator )`标识时,获取每个ts包的payload
data.push(payload)
//遇到下一个`pusi`标识时,
//合并data中的payload,作为一个PES单元
//解密PES数据段,再把解密后的payload回写到TSPacket

reference

AES五种加密模式

aliplayer-vod.js

aes-js

jsencrypt

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

https://github.com/fy-create/TSParser