duanjiu3486 2016-11-24 13:57
浏览 184

Golang AES在通过HTTP流式传输视频之前对其进行解密

Im trying to stream AES encrypted video file; however we need to decrypt it on the fly before streaming it though http

how to write the output of decrypted data to 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)
        }
  • 写回答

1条回答 默认 最新

  • dongyong1942 2016-11-26 17:28
    关注

    i have enhanced my code

    so if i requested an encrypted file, the server will decrypt it and serve it properly, however i have another problem as below

    the problem now is that i get corrupted file if file exceeds certain size.

    i have done some tests on text files for debugging purposes and so i can post data results here (big corrupted file) check the end of the 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)
            }
    
    评论

报告相同问题?

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法