视觉密码 - 极客范 - GeekFan.net

本文由 极客范 - MyDearFlasH 翻译自 datagenetics。转载请参见文章末尾处的要求。

这是一篇关于视觉密码的文章。视觉密码是一种通过编码系统将文件(图像、文本、图表)加密且可由裸眼来解密的技术。它不需要一台计算机来解码。

我将要描述的这项技术归功于两位伟大的数学家Moni Naor Adi Shamir1994年所做出的工作。下面我将展示如何实现把一个机密信息分解为两个组件。这两个组件对重建和揭示此机密都十分重要,但独立开它们却毫无用处。

left_right此技术的核心是将两个半透明图层叠加(覆盖)。两张半透明图层似乎被一些列随机的黑色像素所覆盖。

在两张单独的图层上没有任何信息可寻。当它们重叠时则会出现一条互相干扰的光带(从数学上讲,两张图片进行了一次布尔或运算),但它看起来仍旧是一系列随机的像素组合。

merge2

但奇妙的是当两张网格状图层完全重合时,一条信息神奇的出现在了相应的位置。出现的图案就是所要被解释的信息。

result

示范

让我们来看两组实际中的例子,之后我们将讲述这项技术是如何工作的。

下面你将看到两个看似随机的点阵矩形。其中一个被固定在了背景的中心,另外一个你可随意拖动。当两矩形相交时,它们中的图像也合并了。如果你将两个矩形完美的重合在一起,一张隐藏的图片将会出现。在这个例子中有三张隐藏的图片,当你解码出一张后可以点击左下角的按钮来继续下一张。(去原文实际体验

animation_1 animation_2

为了让你得到反馈,一旦两张图片完美对齐,左下角的前进按钮会变成一个带有红框的按钮(不要担心,你的电脑不会在五秒钟内自毁)。

它是如何工作的?

第一步我们将取一张单色图片作为源图片。图片中的像素非黑即白。下面的源图片就是上面动画中我们看到的第一张图。

test

接下来我们将每一个像素细分成四个子像素。我们需要用阴影遮罩(涂黑)这四个子像素以画出案例中的图片,之后主观得将他们分发到需要创建的两张密码图片上。

q

我们需要如下原则分发这些遮罩,如果你只拥有一张密码图片则由它无法决定出另一张图片上的内容,从而无法解密整张图像。

我们需要做的是看一下源图片中每个像素的颜色。如果图片中的原像素是黑色的,我们填充好四个子像素然后将他们两俩分发到两个密码图层中。我们用掷硬币的方式来决定哪中样式放置在哪个图层中(所以其结果是随机的)。无论哪一对样式分发到哪一个图层,最终当它们重合时四个子像素都会是黑色的。

h

相反,如果源图片中的像素是白色的则只遮罩它的两个子像素。这次我们无论如何要保证两个图层中的像素遮罩情况一致。如此做的话当两张密码图层重合时只有一半像素被遮罩了。我们依旧使用掷硬币的方式来决定使用哪一对手性集,同时保证两张图层上使用图样的遮罩像素。

经过如此加工的两张图片(都为原图像素数的四倍)重合为一张时,其只有原图一半的对比度。源图中的黑色部分在密码中仍为黑色,白色部分则变成了随机状的半色调灰色。幸运的是密码仍旧具有足够高可读性的对比度。

f

拥有一张密码图片的人能够读出每一个像素中的(2×2)样式,但他却无法得知另外一张图片中相应像素簇是相同(白色)或不同(黑色)。两个图层中每一个(2×2)子像素表都准确拥有两个黑色像素。当然了,两个被遮罩的子像素如何选择并不需要按照上面我所使用的棋盘样式。规则为:只要这两个子像素是随机遮罩,不论在另一图层上的像素使用相同或相互填充的遮罩,则该加密系统就是有效的。

a

下面是一段这样的(2×2)子像素块滑过彼此的动画(点击这里去原文查看

十分酷是吧?那么接下来会更加精彩…

NaorShamir的原论文中讲到此系统如何在更通用的方法下实现。例如放弃将图片分割为两份密码文本,为什么不将其分割为n份密码文本呢?需要将n份文本结合方能揭示最终的图片。(或是n的一个拥有k张图片的子集)如果你有兴趣阅读更多的原论文,在这里你可以找到它的重印版。

下面是一些(3×3)子元素阵的例子,他们可以用来将一张图片分发到四张密码图片上。还原原图片需要全部四张的结合。

4

第一行展示的子像素阵用来表现原图中的黑色像素,下面一行表现白色像素。

当每行的四张图片结合时,第一行的结果包含九个黑色像素(全黑),而第二行的结果只包含八个(使得有亮度透出来为图片的可读性制造必要的对比度)。

这样你便知道为何不凑齐四个人手中的图片是无法来解开机密的了。(从数学上来讲,将一个像素分割为八个子像素而不是九个即可完成对原图的分割,但八个无法封装为方阵且难以分割!)

视觉隐写术

我们可以用这项技术做一些更酷的事情!

想象除了两张源图片外,我们有第三张密码图片想要加密。比方说我们想要制作两张看起来无辜的暗号图片,却秘密隐藏着第三张图片。被制作出的两张暗号图片可以印在透明胶片上,看起来十分普通平常,且看不出任何结果。但是当我们用正确的方法结合这些图片时,第3张图片上的秘密便会揭示出来。

c

这项将图片隐藏在其他图片中的技术叫做隐写术。下面是一个我已完成的例子。开始你也许会不相信它。你会说服自己是一些幕后脚本改变了图片。我向你保证它并不是你所想象的那样,你会相信我的。下面的左图中是我的名字,在一张单色图片上进行了编码且包含了第三张隐藏图片的一部分细节。右边是一张用相同编码写有“Fish”的图片。现在拖动右侧图片到左侧图片上,观察当它们完美重叠时发生了什么。这很酷不是么?(点击原文体验动画

animation_3 animation_4

魔法究竟是如何发生的?

我们要编码的隐藏图片有黑色和白色像素。如之前我们将每个像素分割成(2×2)子像素阵。当两张图片重合时我们想要隐藏图片中黑色部分的四个子像素都是黑色,白色部分的子像素有三个是黑色。这样隐藏图片就有了充足的对比度。

对于隐藏图片中的两种像素来说,两张源图片有四种可能的像素组合来实现。对于两张源图片,子像素阵中有三个黑色子像素为黑色,有两个黑色子像素为白色。

源图片1与源图片2的八种像素像素组合示例排列如下:

c2

当隐藏图片像素为黑色时:

当隐藏图片像素为白色时:

此概念的一些潜在用途

这项技术有隐藏问题真实答案的能力,这让我直接想到将它用在如何使一项调查报告得到真实的结果上。当此调查的主题令人尴尬,往往使得人们不愿给出真实的答案时尤其有用。

假设你打算开展一项调查,目的是了解听众的某些特征。假如调查问题中涉及一些敏感问题(如关于政治倾向、性取向的问题,是否有过欺诈行骗行为,或是否犯错导致公司蒙受大量损失),人们也许会有给出不真实答案的动机,无论出于尴尬、同行压力或是恐惧。

而且偏执的人们往往会有更多的担忧:即使是匿名调查,对于某些问题的答案也会足够清楚地人肉到具体的某个人。对此这些人会给出关于敏感问题的虚假答案。

如何解决这个问题?给填写你调查问卷的人一枚硬币。当出现例如你是否犯过错导致公司损失了巨额的美金?”这样的尴尬问题时,请被调查的人掷一次硬币。如果硬币正面向上则被调查人要如实回答问题。如果硬币背面向上则再掷一次硬币,如果正面向上则填,反之则填

任何看到调查结果的人都无法得知一个为真实的答案还是掷硬币的结果。这样参与调查的人就避免了被其他人认出的尴尬。

由于你可以裁剪掉答案中那些预计是假答案的数量,然后扩大剩余答案的规模,那么通过大数定律就能够很好的估算出有多少人曾犯过昂贵的错误

有关这一主题的其他文章

如果你喜欢这篇文章,你可能也会喜欢这篇关于隐写术的文章,以及这篇关于共享秘密的文章

原文链接: datagenetics 翻译: 极客范 - MyDearFlasH

译文链接: http://www.geekfan.net/4138/

[ 转载请保留原文出处、译者和译文链接。]