xue5hen 发表于 2022-11-23 23:29

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)
}

选择的这个答案其实不是我想要的,没回答到点上,不过这张截图让我看到点信息,间接帮我提供了一点思路,还是表示感谢。

sywlyxgs 发表于 2022-11-23 23:29


就是普通的加密解密啊

1读取m3u8地址list
2下载分块 ts
3解密ts
4播放

sywlyxgs 发表于 2022-11-23 23:46

请求链接发出来,密钥iv,发出来我试试

温柔 发表于 2022-11-23 23:51

我用过Crypto,key是16进制的

xue5hen 发表于 2022-11-24 00:00

本帖最后由 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:}

boxer 发表于 2022-11-24 08:32

下载不了,提示缺少playerid{:1_907:}

4899 发表于 2022-11-24 08:45

xue5hen 发表于 2022-11-24 00:00
链接 https://mp42hls.cdn.bcebos.com/2022/zhiyeyaoshi/gaofenjiqiaoke/1.17xy/1.17xypt.m3u8
KEY5bn ...

执业药师,楼主成功了麻烦分享一份

4028574 发表于 2022-11-24 09:34

直接看我得下载器项目不就完事了多省心
我项目都开源得

xue5hen 发表于 2022-11-24 10:44

boxer 发表于 2022-11-24 08:32
下载不了,提示缺少playerid

playerId=pid-1-5-1
这是个固定值,在视频插件源码里有

xue5hen 发表于 2022-11-24 10:50

4028574 发表于 2022-11-24 09:34
直接看我得下载器项目不就完事了多省心
我项目都开源得

谢谢。不过我目的不是要下载视频,能下载的方法我知道有很多,只是要知道用js怎么实现解码{:1_893:}
虽然videojs等插件的源码里也有,但是耦合性太强,单独筛出来工作量太大
页: [1] 2 3
查看完整版本: js解密aes加密的ts文件数据