之前使用C语言实现了一次,见M3U8数据流ts的AES-128解密并合并。
学习了Go语言后,又用Go重新实现了一遍。源码如下,无第三方库依赖。
package main
import (
"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]byte
binary.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 int
var err error
if 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")
}
原文地址:https://blog.csdn.net/zhyulo/article/details/133586794
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_27956.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。