• 如何使用AES128位进行视频解密


    要实现AES128位加解密,可以使用JavaScript的crypto-js库。以下是一个简单的示例:

     HTML代码:

    <video controlsList="nodownload" controls>video>

    首先,需要安装crypto-js库:

    npm install crypto-js
    

    然后,可以使用以下代码进行AES128加解密: 

    1. import CryptoJS from 'crypto-js';
    2. const secretKey = 'your-secret-key'; // 替换为你的 AES 密钥
    3. const iv = 'your-iv'; // 替换为你的 AES IV
    4. const videoSourceUrl = 'your-video-url'; // 替换为你的视频的url,即video的src
    5. /**
    6. *
    7. * @param {*} iv AES IV
    8. * @param {*} key AES 密钥
    9. * @param {*} url 视频的url
    10. * @param {*} start 需要请求的视频段的起始位置
    11. * @param {*} end 需要请求的视频段的结束位置
    12. * @returns 解密后的视频
    13. */
    14. const fetchAndDecryptSegment=async (iv,key,url, start, end='')=>{
    15. // 调用后端接口获取加密的视频流
    16. const response = await fetch(url, {
    17. headers: {'Range': `bytes=${start}-${end}`}
    18. });
    19. const encryptedData = await response.arrayBuffer(); // 将获取到的加密的视频流转为Buffer类型
    20. const encryptedWordArray = CryptoJS.lib.WordArray.create(encryptedData);// 将Buffer类型的视频流转为WordArray类型
    21. // 解密视频流
    22. const decrypted = CryptoJS.AES.decrypt(
    23. {ciphertext: encryptedWordArray},
    24. CryptoJS.enc.Utf8.parse(key),
    25. {
    26. iv: CryptoJS.enc.Utf8.parse(iv),
    27. mode: CryptoJS.mode.CBC,
    28. padding: CryptoJS.pad.Pkcs7,
    29. }
    30. );
    31. // 对解密后的视频流进行编码
    32. const uint8Array = new Uint8Array(decrypted.sigBytes);
    33. for (let i = 0; i < decrypted.sigBytes; i++) {
    34. uint8Array[i] = (decrypted.words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
    35. }
    36. return uint8Array;
    37. }
    38. const loadVideo=async ()=>{
    39. // 获取解密后的视频流,start 传0,end 不传,表示加载完整视频
    40. const decryptedData=await fetchAndDecryptSegment(iv,secretKey,videoSourceUrl,0)
    41. // 将解密后的视频流转成Blob对象
    42. const blob = new Blob([decryptedData], { type: "video/mp4" });
    43. // 创建Blob对象的临时URL
    44. const url = URL.createObjectURL(blob);
    45. const videoElement = document.getElementsByTagName('video')[0];
    46. // 将URL赋值给video的src
    47. videoElement.src=url
    48. }
    49. loadVideo()

     上述代码中,通过fetch获取视频数据,其中在 Headers 中配置了 'Range': `bytes=${start}-${end}` 是准备做视频分段加载播放的,经过调研,目前只有 fmp4 格式的视频才支持视频分段播放,所以,如果需要进行分段播放需要后端将视频转码成 fmp4 格式的视频。

  • 相关阅读:
    世界杯太精彩了,带大家用Python做个足球游戏,边玩游戏边看比赛
    从零创建Docker用基础镜像 - CentOS7.9 x86_64
    【报错】File ‘xxx.ui‘ is not valid
    echarts+vue——散点图+折线图——技能提升
    GAN网络得到的图片模糊,噪声严重,求如何改善
    Java经典面试题汇总:异常
    欠拟合(Under-Fitting)、拟合(Fitting)、过拟合(Over-Fitting)示例
    五款朴实无华却又能极大提升办公效率的软件
    好用的Java开发IDEA插件汇总推荐
    【OpenCV】VS编译器配置OpenCV库路径
  • 原文地址:https://blog.csdn.net/qq_30193097/article/details/139152786