当然,每个人都可以在电视和互联网上看到人们的照片,尤其是模糊地遮住脸孔的照片。 例如,比尔·盖茨:
在大多数情况下,这是可行的,因为没有简便的方法可以将模糊反转为足够详细的照片以识别脸部。 因此,面对一切,一切都很好。 但是,许多人都模糊了机密
数字和
文本 。 我将说明为什么这是一个坏主意。
假设某人出于某种可怕的原因在互联网上发布了他的支票或信用卡的照片(在论坛上证明他赚了100万美元或显示有趣的东西,或将某事物的大小与信用卡进行比较等)。 ),使用过于常见的马赛克效果模糊图像以隐藏数字:
似乎很安全,因为没人会读这些号码吗? 错误的答案。 该方案受到攻击:
步骤1.获得干净的支票图像
有两种方法可以做到这一点。 您可以在图形编辑器中删除数字,也可以在同一家银行中开设一个帐户,并从同一角度拍摄自己的卡,结合白平衡和对比度。 然后在图形编辑器中将其删除(在高分辨率照片中更容易做到)。
当然,在我们的示例中,这很容易做到:
步骤2.迭代
使用脚本来遍历所有可能的帐号,并为每个帐号创建一个检查,以分隔成组的号码。 例如,在VISA卡上,数字按4分组,因此您可以单独处理每个部分。 这只需要4×10,000 = 40,000个图像,这很容易由脚本生成。
第3步。模糊每个图像与原始相同
确定用于模糊原始图像的马赛克的确切大小和像素偏移(简单),然后对每个模糊图像进行相同的处理。 在这种情况下,我们看到模糊的图像由8x8像素的马赛克组成,并且偏移量是通过从图像的上边界开始计数来确定的(未显示):
现在,我们对所有图像进行排序,以与原始图像相同的方式模糊它们,然后得到如下所示的内容:
步骤4.确定每个模糊图像的镶嵌亮度矢量。
这是什么意思? 好吧,让我们看一下镶嵌版本0000001(增加):
...并确定镶嵌图每个区域的亮度等级(0-255),以某种一致的方式将它们命名为
a=[a1,a2...,an] :
在这种情况下,帐号0000001创建一个镶嵌亮度矢量
a(0000001)=[213,201,190,...] 。 我们使用脚本对每个图像进行模糊处理并读取亮度,以相同的方式找到每个帐号的镶嵌亮度矢量。 让
a(x) -帐号功能
x 。 然后
a(x)i 表示镶嵌亮度向量的第i个向量值
一 从帐号获得
x 。 以上
a(0000001)1=213 。
现在,我们对在Internet或任何地方找到的原始参考图像执行相同的操作,得到一个矢量,我们将在此处调用
z=[z1,z2,...zn] :
步骤5.找到最接近原始图像的那张。
定义原始图像的马赛克的亮度矢量,我们称它为
z=[z1,z2,...zn] 然后只需计算每个帐号的距离(以
x )到镶嵌的亮度向量(归一化后):
d(x)= sqrt((a(x)0/N(a(x))−z0/N(z))2+(a(x)1/N(a(x))−z1/N(z))2+...)
其中
N(a(x))
和
N(z)
是给定的归一化常数
N(a(x))=(a(x)20+a(x)21+...)2
N(z)=(z20+z21+...)2
现在找到最小的
d(x) 。 对于信用卡,只有一小部分可能的数字可以确认假设的信用卡数量,因此这里也没有什么复杂的。
例如,在我们的例子中,我们计算
N(z)= sqrt(2062+2112+...)=844.78459
N(一个(0000001))=907.47837
N(一个(0000002))=909.20647
然后继续计算距离:
d(0000001)=1.9363
d(0000002)=1.9373
...
d(1124587)=0.12566
d(1124588)=0.00000
...
也许帐号对应于镶嵌1124588?
“但是您使用了自己的图像,很容易破解!”
在现实世界中,是真实的照片,而不是用Photoshop拍摄的虚拟实例。 由于摄像机角度,不正确的对齐方式等原因,导致文本失真。 但这并不能阻止一个人准确地确定变形的类型并创建合适的脚本! 在任何情况下,都可以考虑使用一些最短的定义距离,尤其是在信用卡世界中,精美地将数字分为4组,实际上每10个数字中只有1个是有效数字,因此可以轻松地从几个最可能的距离中进行选择候选人。
为了在真实照片中实现这一点,应改进距离算法。 例如,您可以重写上述距离公式,以标准化除平均值以外的标准偏差。 您还可以为镶嵌图的每个区域独立处理RGB或HSV值,以及使用脚本在每个方向上使文本变形几个像素并进行比较(在快速PC上,比较的次数仍然非常有限)。 您可以使用类似于现有最近邻算法的算法来提高真实照片中工作的可靠性。
所以,是的,我使用了我的图像并将其用于这种情况。 但是,对于实际应用,可以肯定地对该算法进行改进。 但是我既没有时间也不想改善任何事情,因为我不寻求您的信息。 但是可以肯定的是:这是一个非常简单的情况。 请勿使用简单的马赛克来模糊图像。 您要做的就是减少包含所有内容的图像中的信息量
log(10N)/log(2) 帐户数据的有效位。 分发此类图像时,您希望
消除个人信息,而不是通过减少视觉信息量来阻止对其的访问。
想象一下100×100的图形图像。 假设我只是对像素进行平均,然后将每个像素均替换为平均值(也就是说,我将图片变成了单像素“马赛克”)。 您刚刚创建了一个函数,该函数从256 ^(10000)个变体中哈希最多256个变体。 显然,使用收到的8位,您将无法还原原始图像。 但是,如果您知道原始图像总共有10个选项,那么使用这8位,您可以轻松确定使用了哪个。
字典攻击类比
大多数UNIX / Linux系统管理员都知道/ etc / passwd或/ etc / shadow中的密码是使用单向功能(例如Salt或MD5)加密的。 这是非常安全的,因为没有人可以通过查看其加密文本来解密该密码。 通过对用户进入系统时输入的密码执行相同的单向加密,并将此结果与保存的哈希进行比较,从而进行身份验证。 如果它们匹配,则用户已成功通过测试。
众所周知,当用户选择词典词作为密码时,单向加密方案很容易破解。 攻击者所需要做的就是对整个英语词典进行加密,将每个单词的加密文本与/ etc / passwd中存储的加密文本进行比较,然后选择正确的单词作为密码。 因此,通常建议用户选择不是单词的更复杂的密码。 字典攻击可以说明如下:
同样,图像模糊是一种单向加密方案。 您将拥有的图像转换为另一个要发布的图像。 但是由于帐号通常不超过数百万,因此我们可以编写可能的号码的“字典”。 例如,所有数字都从0000001到9999999。然后开始自动处理,这会将这些图像中的每一个放置在空背景的照片上,并对每个图像进行模糊处理。 然后剩下的只是比较模糊的像素,看看哪个选项最匹配原始像素。
解决方案
解决方案很简单:不要模糊图像! 相反,只需在它们上面绘制:
请记住,您想要完全删除信息,而不是减少信息量(如照片模糊)。