Golang AES 在通过 http 流式传输视频之前解密视频

标签 go video-streaming aes

我正在尝试流式传输 AES 加密的视频文件;但是我们需要在通过 http 流式传输它之前对其进行动态解密

如何将解密数据的输出写入http writer

 package main

        import (
            "crypto/aes"
            "crypto/cipher"
            "io"
            "log"
            "net/http"
            "os"
        )

        var key []byte = []byte("yourAESPrivateKey")

        func ServeHTTP(w http.ResponseWriter, r *http.Request) {
            inFile, err := os.Open("2.ts")
            if err != nil {
                log.Fatal(err)
            }
            defer inFile.Close()

            block, err := aes.NewCipher(key)
            if err != nil {
                log.Fatal(err)
                return
            }
            var iv [aes.BlockSize]byte
            stream := cipher.NewOFB(block, iv[:])
            w.Header().Set("Content-type", "video/mp4")
            writer := &cipher.StreamWriter{S: stream, W: w}

            if _, err := io.Copy(writer, inFile); err != nil {
                log.Fatal(err)
                return
            }

            //http.ServeContent(w, r, "video.mp4", time.Now(), inFile)
        }

        func main() {
            http.HandleFunc("/", ServeHTTP)
            http.ListenAndServe(":2020", nil)
        }

最佳答案

我已经增强了我的代码

所以如果我请求一个加密的文件,服务器将解密它并正确地提供它,但是我有另一个问题如下

现在的问题是,如果文件超过一定大小,我会得到损坏的文件。

出于调试目的,我已经对文本文件进行了一些测试,因此我可以在此处发布数据结果 (big corrupted file) 检查文件末尾

package main

        import (
            "crypto/aes"
            "crypto/cipher"
            "log"
            "net/http"
            "os"
            "time"
        )

        type cipherHttpWriter struct {
            http.ResponseWriter
        }

        func (c cipherHttpWriter) Write(b []byte) (int, error) {
            var key []byte = []byte("we!@09bsa$.a-ala.HJOqweK45aghf&A")
            block, err := aes.NewCipher(key)
            if err != nil {
                return 0, err
            }
            var iv [aes.BlockSize]byte
            stream := cipher.NewOFB(block, iv[:])
            streamWriter := &cipher.StreamWriter{S: stream, W: c.ResponseWriter}
            defer streamWriter.Close()
            return streamWriter.Write(b)
        }

        func ServeHTTP(w http.ResponseWriter, r *http.Request) {
            inFile, err := os.Open(string(r.URL.Path[1:]))
            if err != nil {
                log.Fatal(err)
            }
            defer inFile.Close()
            writer := cipherHttpWriter{}
            writer.ResponseWriter = w

            http.ServeContent(writer, r, "", time.Now(), inFile)
        }

        func main() {
            http.HandleFunc("/", ServeHTTP)
            http.ListenAndServe(":2020", nil)
        }

关于Golang AES 在通过 http 流式传输视频之前解密视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40788272/

相关文章:

json - Go:不能解码?

c# - 在 C# 中使用 RTMP 或 RTSP 协议(protocol)

encryption - 密码、Salt 和 IV,我需要所有这些吗?

php - AES-256-GCM 在 M1 Macbook 上的 PHP ext-sodium 中不可用

c - (C语言)基于AES-CTR的加密解密工具中的乱码解密

algorithm - GoLang 堆和堆排序

go - 服务器端 oauth : What to do with the tokens received

file - 如何执行文件系统扫描

ios - 在 iOS 8 中像 youtube 一样播放视频

javascript - 如何将 Base64 数据流式传输到视频中