本帖最后由 xue5hen 于 2022-11-24 13:54 编辑
想写个m3u8的视频下载功能,但是卡在解密这个环节了。
在已知key、iv,并且已经拿到加密的ts数据(arraybuffer)的情况下,怎么还原出ts数据的真实面目?
我在网上搜了很多帖子,但试了都不能达到目的。
测试过无效的方法:
1)使用的库 aes-decrypter
[JavaScript] 纯文本查看 复制代码 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 : [0, 0, 0, 0])
new Decrypter(v, keybytes, keyiv, (err, decryptedBytes) => {
if (err) reject(err)
else resolve(decryptedBytes)
})
})
2)使用的库 crypto-js
[JavaScript] 纯文本查看 复制代码 // 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[this.decryptMode],
padding: CryptoJS.pad[this.decryptPadding]
})
// 把解密后的对象再转为base64编码,这步是关键,跟解密文字不同
let d64 = decryptedData.toString(CryptoJS.enc.Base64)
return base642arraybuffer(d64)
}
选择的这个答案其实不是我想要的,没回答到点上,不过这张截图让我看到点信息,间接帮我提供了一点思路,还是表示感谢。 |