———用途———
将任意视频/文件编码为噪声视频,通过解码得到原始视频/文件。
这可以做到对已封禁或正在被审查的视频提供保护。
———原理———
通过 Reed-Solomon 编码 将任意文件转换为白噪声视频,并在允许范围内部分丢失数据的情况下可将噪声视频还原到哈希值(SHA-256)相同的原始文件。
项目地址:https://github.com/ERR0RPR0MPT/Labyrinth-go
———优点———
- 如果你需要转换的原始文件是一个视频,那么恭喜你,这是项目实现的主要目标。
使用此方法转换得到的原始视频即使哈希不匹配,在可接受的数据损失下,画面仍然是可读的。
这种方案对比使用对视频逐帧处理为白噪声再上传到视频平台压缩后下载下来处理为原视频的方法,后一种方法的数据已经被压缩丢失的差不多了,所以基本上不可行;此方法中可以将白噪声使用低分辨率视频作为载体,避免被二次编码时压缩过多数据。
如果你需要转换的是一个文件,那你需要万无一失地确保解码不会出现错误。
项目没有使用任何加密算法,所以编码后的噪声视频也能看出存在各种明文特征。你可以搭配压缩或加密程序使用本项目。
此方案也可以用于其他的场景,比如可以打破某些云盘只能上传视频不能上传文件的限制。
项目使用 Go 实现,对配置要求不是很高。
———缺点———
- 为了保证数据尽可能的完整性,项目使用视频中的 8 个像素 表示数据的 1 字节,以及使用 Reed-Solomon 编码 进行数据纠错。这导致白噪声视频的大小是原始文件的 5-10 倍(取决于 dataShards 与 parityShards 的比值)
- 对磁盘 IO 有较高要求。
- 项目目前处于能用的状态,但经实验,经过冗余产生的噪声无论 dataShards 与 parityShards 的比值如何,经过转换得到的解码文件的质量总与视频损失的码率有关,可能是压缩时总是均匀损失数据导致的?(或者只是单纯的 Bug
- 在时间消耗上,编码 100MB 的数据需要 12min 左右,解码需要 8min 左右,对于急需使用此数据的情况来说较慢。