js解密aes加密的ts文件数据
本帖最后由 xue5hen 于 2022-11-24 13:54 编辑想写个m3u8的视频下载功能,但是卡在解密这个环节了。
在已知key、iv,并且已经拿到加密的ts数据(arraybuffer)的情况下,怎么还原出ts数据的真实面目?
我在网上搜了很多帖子,但试了都不能达到目的。
测试过无效的方法:
1)使用的库 aes-decrypter
new Promise((resolve, reject) => {
let view = new DataView(keyContent.buffer)
let keybytes = new Uint32Array([
view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12),
])
let keyiv = new Uint32Array(ivContent ? ivContent.buffer : )
new Decrypter(v, keybytes, keyiv, (err, decryptedBytes) => {
if (err) reject(err)
else resolve(decryptedBytes)
})
})
2)使用的库 crypto-js
// AES解密
decrypt (buffer, key, iv) {
key = this.key || key || ''
iv = this.iv || iv || ''
// 处理key和iv的格式
let keyWA = key
if (typeof key === 'string') {
// 密钥转字节数组(16位)
let keyBy = stringToBytes(key)
// 字节数组转Uint8Array
let keyBv = new Uint8Array(keyBy)
// Uint8Array转WordArray
keyWA = CryptoJS.enc.u8array.parse(keyBv)
}
let ivWA = iv
if (typeof iv === 'string') {
iv = iv.substring(0, 16)
let ivBy = stringToBytes(iv)
let ivBv = new Uint8Array(ivBy)
ivWA = CryptoJS.enc.u8array.parse(ivBv)
}
let view = new Uint8Array(buffer)
// 将Uint8Array 转成 WordArray
let contentWA = CryptoJS.enc.u8array.parse(view)
// base64字符串
let dcBase64String = contentWA.toString(CryptoJS.enc.Base64)
// 解密
let decryptedData = CryptoJS.AES.decrypt(dcBase64String, keyWA, {
iv: ivWA,
mode: CryptoJS.mode,
padding: CryptoJS.pad
})
// 把解密后的对象再转为base64编码,这步是关键,跟解密文字不同
let d64 = decryptedData.toString(CryptoJS.enc.Base64)
return base642arraybuffer(d64)
}
选择的这个答案其实不是我想要的,没回答到点上,不过这张截图让我看到点信息,间接帮我提供了一点思路,还是表示感谢。
就是普通的加密解密啊
1读取m3u8地址list
2下载分块 ts
3解密ts
4播放
请求链接发出来,密钥iv,发出来我试试 我用过Crypto,key是16进制的 本帖最后由 xue5hen 于 2022-11-24 00:07 编辑
sywlyxgs 发表于 2022-11-23 23:46
请求链接发出来,密钥iv,发出来我试试
链接 https://mp42hls.cdn.bcebos.com/2022/zhiyeyaoshi/gaofenjiqiaoke/1.17xy/1.17xypt.m3u8
KEY5bn7W6u5tq6qHvgm
iv 0xd18580625f3891bf11aa9a68368d2fff
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:15
#EXT-X-KEY:METHOD=AES-128,URI="https://drm.media.baidubce.com/v1/encryptedVideoKey?videoKeyId=job-nagwj6jjuncdytb0",IV=0xd18580625f3891bf11aa9a68368d2fff,KEYFORMAT=media-drm-player-binding
#EXTINF:10.000000,
1.17xypt.m3u8.0.ts
本来是想找个HLS的AES标准加密的视频,但是一时找不到,就先用这个做测试了,KEY应该是对的(参考了https://www.52pojie.cn/forum.php ... 5800&highlight=m3u8这个帖子),也有可能一时匆忙搞错。你有别的加密视频也行,只要能实际调试通就行。我主要是想知道代码逻辑哪儿不对,不对的话应该怎么写{:1_893:} 下载不了,提示缺少playerid{:1_907:} xue5hen 发表于 2022-11-24 00:00
链接 https://mp42hls.cdn.bcebos.com/2022/zhiyeyaoshi/gaofenjiqiaoke/1.17xy/1.17xypt.m3u8
KEY5bn ...
执业药师,楼主成功了麻烦分享一份 直接看我得下载器项目不就完事了多省心
我项目都开源得 boxer 发表于 2022-11-24 08:32
下载不了,提示缺少playerid
playerId=pid-1-5-1
这是个固定值,在视频插件源码里有 4028574 发表于 2022-11-24 09:34
直接看我得下载器项目不就完事了多省心
我项目都开源得
谢谢。不过我目的不是要下载视频,能下载的方法我知道有很多,只是要知道用js怎么实现解码{:1_893:}
虽然videojs等插件的源码里也有,但是耦合性太强,单独筛出来工作量太大