重复造轮子之图像加密解密
- Color
- 三十分钟系列
重复造轮子之图像加密解密
最近听到了一个故事,如果省略一下细节,就是:
警告
你给我成片看看,但是别把片子漏出去。
“无敌”水印
说到保密,我们马上就会想到最简单+有效的方法之一:加水印!
这样的水印有几个好处:
- 简单,谁都会加
- 有一定的震慑能力(带了名字,漏出去能找到)
- 在一定程度上不影响观感,打开就能看
虽然加了水印,但是本质上内容还是可以看到的,因此还是存在“内容泄露” 的风险。
比方说:我通过某种方式提前看了《信条》的成片,然后我并不直接将影片泄露出去,而是将内容剧情以口述、文字、图片等二次创造的方式传播出去。这种泄露的破坏力还是不小的。
压缩包+密码
既然上面加水印的方式还是存在“中间人” 偷取的风险,那么很容易想到利用压缩包+密码的方式来防止文件在传输过程中被他人泄露。
不过这种方式也存在一些问题:
- 只要可以解压还原出最终的
mov
,那么后续面临的问题和水印mov
就没有区别了 - 压缩包总是需要压缩和解压,当我们需要赶紧看一下的时候,比较麻烦……
有没有更好的加密方式?
我个人心中比较优秀的影片加密方式,需要满足下面的这些特性:
- 文件本身还是一个通用的图像格式
- 可以使用“相对通用”的软件进行播放
- 加密后的图像,让人猜不出原始画面的内容(包括色彩、形状)
- 密钥本身很容易传输(数字、字符)
- 加密的强度OK,让一般人放弃破解的欲望
其实这不禁让我想起了很早之前的一个编码格式:Sorenson Video 3
。
这个编码格式通过提供一个media key
文件,可以让用户直接通过 QuickTime
播放加密后的 mov
文件。
听起来非常完美!不幸的是:
- 这个编码格式是商用的,需要付费
- 这家公司“好像黄了”?http://sorensonmedia.com 已经打不开了
那怎么办?没关系,我们可以重复造轮子啊!
说到加密,我脑海里面会出现两种思路:
- 人民群众生活中质朴的智慧
- 专业领域的算法
乱序洗牌法
想要对方看不出来原始画面的信息,质朴的智慧就会想到以“某种方式”打乱像素的顺序。这样整个画面就让人看不懂了。
原始画面
“某种方式”打乱
我们基于这个思路,就可以写一个DaVinci Resolve
的dctl
插件,加密方选择任意 seed+loop
的组合。然后渲染出加密后的影片。
之后将加密后的影片,以及seed、loop
两个数字告诉解密方,解密方也用这个插件,就可以看到原始的画面了。
RSA 加密
接下来就要用到专业领域的知识了。RSA
加密算法是非常常见的加密算法。具体的算法本身这里就不多说了,网上有很多非常棒的解释。
原始画面
RSA 加密(亮度降低,方便查看)
同理,这里为了操作简单,UI 上面做了一些 trick。
seed_1、seed_2、seed_3
这三个数值就相当于密码。
将这三个密码告诉解密方,就可以的进行解密了。
写在最后
估计马上有小伙伴会想到套娃操作了:水印+RSA+打乱+密码压缩包+……
其实加密算法就是在保护强度、使用便利性之间找到一种“平衡”。而且不管怎么加密,最后图像还是要给“人”看的,那么总是存在解密后泄密的可能。一旦到了人的层面,这就开始升华了……
上面两种加密方式,也存在一些弊端。例如不能缩放、不能使用有损压缩格式、需要支持>1浮点数 等等,否则解码后的画面会出现不同程度的无法还原。因此请自己选择具体的使用场景哦~
由于加密算法实现本身就是一种秘密,所以这次就不能完全公开源码了,不过还是可以分享一下加密后的dctle
文件,方便日常使用。如果你想要自己再次重复造轮子,非常欢迎!因为你可以学到:
- 辗转相除法
- 快速大数求幂求余算法
- 快速质数筛选法
- 无重复、无遗漏 随机数生成
所以,重复造轮子的本质,不是轮子,而是造啊!
文件下载
点击购买,或者扫描二维码