重复造轮子之图像加密解密

Andy Guo原创
  • Color
  • 三十分钟系列
  • Color
  • Color Science
  • 色彩空间
  • 色彩科学
  • 图像加密
大约 7 分钟

重复造轮子之图像加密解密

最近听到了一个故事,如果省略一下细节,就是:

警告

你给我成片看看,但是别把片子漏出去。

“无敌”水印

说到保密,我们马上就会想到最简单+有效的方法之一:加水印

这样的水印有几个好处:

  • 简单,谁都会加
  • 有一定的震慑能力(带了名字,漏出去能找到)
  • 在一定程度上不影响观感,打开就能看

虽然加了水印,但是本质上内容还是可以看到的,因此还是存在“内容泄露” 的风险。

比方说:我通过某种方式提前看了《信条》的成片,然后我并不直接将影片泄露出去,而是将内容剧情以口述、文字、图片等二次创造的方式传播出去。这种泄露的破坏力还是不小的。

压缩包+密码

既然上面加水印的方式还是存在“中间人” 偷取的风险,那么很容易想到利用压缩包+密码的方式来防止文件在传输过程中被他人泄露。

不过这种方式也存在一些问题:

  • 只要可以解压还原出最终的mov,那么后续面临的问题和水印mov 就没有区别了
  • 压缩包总是需要压缩和解压,当我们需要赶紧看一下的时候,比较麻烦……

有没有更好的加密方式?

我个人心中比较优秀的影片加密方式,需要满足下面的这些特性:

  • 文件本身还是一个通用的图像格式
  • 可以使用“相对通用”的软件进行播放
  • 加密后的图像,让人猜不出原始画面的内容(包括色彩、形状)
  • 密钥本身很容易传输(数字、字符)
  • 加密的强度OK,让一般人放弃破解的欲望

其实这不禁让我想起了很早之前的一个编码格式:Sorenson Video 3

这个编码格式通过提供一个media key 文件,可以让用户直接通过 QuickTime 播放加密后的 mov 文件。

听起来非常完美!不幸的是:

  • 这个编码格式是商用的,需要付费
  • 这家公司“好像黄了”?http://sorensonmedia.com 已经打不开了

那怎么办?没关系,我们可以重复造轮子啊!

说到加密,我脑海里面会出现两种思路:

  • 人民群众生活中质朴的智慧
  • 专业领域的算法

乱序洗牌法

想要对方看不出来原始画面的信息,质朴的智慧就会想到以“某种方式”打乱像素的顺序。这样整个画面就让人看不懂了。

原始画面

“某种方式”打乱

我们基于这个思路,就可以写一个DaVinci Resolvedctl 插件,加密方选择任意 seed+loop 的组合。然后渲染出加密后的影片。

之后将加密后的影片,以及seed、loop 两个数字告诉解密方,解密方也用这个插件,就可以看到原始的画面了。

RSA 加密

接下来就要用到专业领域的知识了。RSA 加密算法是非常常见的加密算法。具体的算法本身这里就不多说了,网上有很多非常棒的解释。

原始画面

RSA 加密(亮度降低,方便查看)

同理,这里为了操作简单,UI 上面做了一些 trick。

seed_1、seed_2、seed_3 这三个数值就相当于密码。

将这三个密码告诉解密方,就可以的进行解密了。

写在最后

估计马上有小伙伴会想到套娃操作了:水印+RSA+打乱+密码压缩包+……

其实加密算法就是在保护强度、使用便利性之间找到一种“平衡”。而且不管怎么加密,最后图像还是要给“人”看的,那么总是存在解密后泄密的可能。一旦到了人的层面,这就开始升华了……

上面两种加密方式,也存在一些弊端。例如不能缩放、不能使用有损压缩格式、需要支持>1浮点数 等等,否则解码后的画面会出现不同程度的无法还原。因此请自己选择具体的使用场景哦~

由于加密算法实现本身就是一种秘密,所以这次就不能完全公开源码了,不过还是可以分享一下加密后的dctle 文件,方便日常使用。如果你想要自己再次重复造轮子,非常欢迎!因为你可以学到:

  • 辗转相除法
  • 快速大数求幂求余算法
  • 快速质数筛选法
  • 无重复、无遗漏 随机数生成

所以,重复造轮子的本质,不是轮子,而是造啊!

文件下载

点击购买open in new window,或者扫描二维码

面包多二维码

温馨提示

现在有 Andy 十分钟色彩科学合集售卖open in new window

十分钟色彩科学面包多二维码

购买后加微信muyanru345,拉入Andy 铁粉儿群,可在群里对学习工作中的色彩疑问进行讨论。

上次编辑于:
贡献者: muyanru