如何使用Golang解密AES加密的传输流片段?

4

我知道使用openssl(已测试过OpenSSL 1.1.0g),以下段落可以解密enc.ts,mimetype:video / MP2T,生成可播放的ffplay清晰的.ts h264片段:

openssl aes-128-cbc -d -in enc.ts -out clear.ts -iv 353833383634 -K 9e8c69bcaafa6b636e076935e29986b5 -nosalt

尽管使用Golang的https://golang.org/pkg/crypto/cipher/#NewCBCDecrypter,但我对十六进制密钥和iv如何设置为字节片、块大小是否是一个因素以及如何加载和写出文件感到非常困惑。
我已经尝试过:
package main

import (
        "crypto/aes"
        "crypto/cipher"
        "encoding/hex"
        "fmt"
        "io/ioutil"
)

func checkerror(err error) {
        if err != nil {
                panic(err)
        }
}

func main() {
        key, err := hex.DecodeString("9e8c69bcaafa6b636e076935e29986b5")
        checkerror(err)
        iv, err := hex.DecodeString("353833383634")
        checkerror(err)
        ciphertext, err := ioutil.ReadFile("enc.ts")
        checkerror(err)
        block, err := aes.NewCipher(key)
        checkerror(err)
        mode := cipher.NewCBCDecrypter(block, iv)
        mode.CryptBlocks(ciphertext, ciphertext)
        fmt.Printf("%s\n", ciphertext)
}

但是这将导致一个panic: cipher.NewCBCDecrypter: IV长度必须等于块大小。我错过了什么?
1个回答

4

你的iv确实太短了,所以openssl只是为你填充了零:

openssl aes-128-cbc -d -in enc.ts -out clear.ts -iv 353833383634 -K 9e8c69bcaafa6b636e076935e29986b5 -nosalt -P
key=9E8C69BCAAFA6B636E076935E29986B5
iv =35383338363400000000000000000000

啊,这个可以用!现在要想办法在Golang中填充。 - hendry
一个提示:编码后的IV应该是32位数字,而解码后应该是16个字节。 - leaf bebop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接