当前位置: 首页 > news >正文

源码分享-M3U8数据流ts的AES-128解密并合并---GoLang实现

之前使用C语言实现了一次,见M3U8数据流ts的AES-128解密并合并。

学习了Go语言后,又用Go重新实现了一遍。源码如下,无第三方库依赖。

package mainimport ("crypto/aes""crypto/cipher""encoding/binary""fmt""io""os""strconv"
)func decodeAES128CBC(key []byte, index int, inFile string, out io.Writer) error {block, err := aes.NewCipher(key)if err != nil {return err}inBuf, err := os.ReadFile(inFile)if err != nil || len(inBuf) == 0 {return err}var iv [16]bytebinary.BigEndian.PutUint32(iv[12:], uint32(index))outBuf := make([]byte, len(inBuf))mode := cipher.NewCBCDecrypter(block, iv[:])mode.CryptBlocks(outBuf, inBuf)pad := int(outBuf[len(outBuf)-1])_, err = out.Write(outBuf[:len(outBuf)-pad])return err
}func decodeAesM3u8(key, inPath, outFile string) (int, error) {out, err := os.Create(outFile)if err != nil {return 0, err}defer out.Close()for i := 0; ; i++ {err = decodeAES128CBC([]byte(key), i, inPath+strconv.Itoa(i), out)if err != nil {if i == 0 {return 0, err}return i, nil}}
}func mergeM3u8(inPath, outFile string) (int, error) {out, err := os.Create(outFile)if err != nil {return 0, err}defer out.Close()for i := 0; ; i++ {in, err := os.Open(inPath + strconv.Itoa(i))if err != nil {if i == 0 {return 0, err}return i, nil}_, err = io.Copy(out, in)if err != nil {_ = in.Close()return i, err}err = in.Close()if err != nil {return i, err}}
}func main() {inPath, key, outFile := os.Args[1], os.Args[2], os.Args[3]var n intvar err errorif len(key) == 16 {n, err = decodeAesM3u8(key, inPath, outFile)} else {n, err = mergeM3u8(inPath, outFile)}if err != nil {fmt.Println(err)return}fmt.Println("successfully converted", n, "files")
}
http://www.lryc.cn/news/182939.html

相关文章:

  • CSDN Q: “这段代码算是在STC89C52RC51单片机上完成PWM呼吸灯了吗?“
  • Linux系统编程系列之线程池
  • Linux CentOS7 vim多文件与多窗口操作
  • SPI 通信协议
  • 【图像处理】使用各向异性滤波器和分割图像处理从MRI图像检测脑肿瘤(Matlab代码实现)
  • 5个适合初学者的初级网络安全工作,网络安全就业必看
  • Kafka核心原理
  • 探秘前后端开发世界:猫头虎带你穿梭编程的繁忙街区,解锁全栈之路
  • 洛谷_分支循环
  • MySQL数据库入门到精通——进阶篇(3)
  • Mind Map:大语言模型中的知识图谱提示激发思维图10.1+10.2
  • [引擎开发] 杂谈ue4中的Vulkan
  • docker--redis容器部署及地理空间API的使用示例-II
  • Vue中如何进行文件浏览与文件管理
  • jenkins利用插件Active Choices Plug-in达到联动显示或隐藏参数,且参数值可修改
  • 香蕉叶病害数据集
  • 天地无用 - 修改朋友圈的定位: 高德地图 + 爱思助手
  • AtCoder Beginner Contest 232(A-G)
  • 计算机网络(第8版)-第5章 运输层
  • AtCoder Beginner Contest 231(D-F,H)
  • 【Python】map
  • Swift 5.9 与 SwiftUI 5.0 中新 Observation 框架应用之深入浅出
  • 【已解决】在 Vite 项目中使用 eslint-config-ali 时遇到的解析错误
  • 蓝桥杯每日一题2023.10.5
  • PyTorch实例:简单线性回归的训练和反向传播解析
  • Arcgis提取玉米种植地分布,并以此为掩膜提取遥感影像
  • 软件工程与计算总结(四)项目管理基础
  • 【Python】datetime 库
  • 从0开始python学习-28.selenium 需要图片验证的登录
  • Nginx搭建Rtmp流媒体服务,并使用Ffmpeg推流