如何实现基于 aes-ctr+s3 的中转加解密

361 天前
 dzdh

想实现那种基于 s3 协议的网络存储加密后的视频文件流式还原成原本内容

加密解密这么做的:

func encode(buff []byte) []byte {
	key := []byte("1234567887654321")
	iv := bytes.Repeat([]byte("0"), 16)

	block, _ := aes.NewCipher(key)
    stream := cipher.NewCTR(block, iv)
    
    encoded := make([]byte, len(buff))
    stream.XORKeyStream(encoded, buff)
    
    return encoded
}
// 加解密密一个文件
readed, _ := open.ReadFile(test.mp4)

encryptd := encode(readed)
decrypted := encode(encrypted)

测试经过加密再解密后的文件 能正常打开也不影响播放

然后基于 http 这么写了个东西

http.HandleFunc("/test.mp4", (w,r) {

    opened , _ := os.open("test.mp4")
    
    // cipher.StreamReader 没有实现 io.Seeker
    // 自己做了个 wrapper
    /*
    type myReader struct {
        cipher.StreamReader
    }

    func (reader *myReader) Seek(offset int64, whence int) (int64, error) {
        // os.open 返回的是 file ,是支持 seeker 的 streamreader 要求的接口是 io.reader
        return reader.R.(io.Seeker).Seek(offset, whence)
    }
    */
    
    key := []byte("1234567887654321")
	iv := bytes.Repeat([]byte("0"), 16)
	block, _ := aes.NewCipher(key)
    stream := cipher.NewCTR(block, iv)
    
    reader := &myReader{StreamReader:cipher.StreamReader{R:open, S:stream} }
    
    http.ServeContent(w,r,"test.mp4",time.Now(), reader)// 这个 reader 要求实现 io.Seeker

})

结果是播放一半直接不能播放了 显示视频时长是对的

看了看别人家的实现。好复杂。。

612 次点击
所在节点    Go 编程语言
1 条回复
dzdh
360 天前
已解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/954401

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX