这里的问题是用于加密的密钥(Stroke 或从 Stroke 派生的东西)必须与加密消息一起发送。否则,解密协议无法将解密笔画与原始笔画进行比较。
所以假设Alice想要加密一些消息M
。她是唯一应该解密消息的人,所以 Bob 不在照片中。Alice 生成一个模糊加密密钥Ke
并加密M
成为Me
:Encrypt(M,Ke) = Me
。发送的消息是(Ke,Me)
。在接收方,Alice 生成模糊解密密钥Kd
。一些算法检查Ke ~ Kd
并Me
解密:Decrypt(Me,Ke) = M
. 请注意,这是对称加密;Kd
仅用于检查它是否“充分等于” Ke
。
当然,问题在于它Ke
与消息一起以明文形式发送,因此Eve可以简单地获取密钥并解密Me
。但是,Ke
接收方需要将其与Kd
. 那么我们如何在Ke
Eve 无法窃听的情况下随消息一起发送呢?我们可以创建一个散列Ke
并通过以下行发送它:(Hash(Ke),Me)
。但是,在接收方,将无法验证 .Ke
和Kd
基于Hash(Ke)
.
我们可以设计一些算法来生成一个基于Ke
这样的值,如果Ke ~ Kd -> V(Ke) ~ V(Kd)
(如果Ke
和Kd
相似,则生成的值是相似的)。我们将消息发送(V(Ke),Me)
给接收者。但是,Eve 现在根据 确定相对Ke
容易V(Ke)
。她从一个随机候选键开始:KeC
并使用我们的算法,确定一个V(KeC)
. 如果它看起来V(Ke)
与消息中的完全不同,她会对候选人进行一些大刀阔斧的改变,KeC
然后再试一次。随着她越来越接近消息,她对等V(Ke)
进行了较小的更改。KeC
Ke
因此,如果我们允许与消息一起发送,就不可能创建一个安全的加密方案。这意味着Ke
必须将其交给受信任的第三方Trent 。在这种情况下,Trent 可以是应用程序的数据库。所以现在方案变成如下:
Alice 生成Ke
一条消息M
和一个唯一的 id Id
。Ke
与我们的数据库 Trent 以及Id
. M
使用Ke
用作密钥的常规加密方案进行加密:Me = Encrypt(M,Ke)
. 发送给接收方的消息是(Me,Id)
。
在接收方,Alice 接收到消息(Me,Id)
。爱丽丝生成Kd
. 基于Id
,我们Ke
从 Trent 中得到对应的,并与 进行比较Kd
。如果匹配,我们解密Me
: M = Decrypt(Me,Ke)
。
现在唯一的问题是当你有一个可以访问特伦特的入侵者马洛里时。他可以向 Trent 询问Ke
基于随机 id 的值。为防止这种情况,您不应将其包含Id
在消息中,以便消息简单地变为(Me)
. 现在你必须想出一个策略来Ke
从 Trent 只使用Kd
. 这当然是可能的,因为您可以Kd
与数据库中的所有Ke
' 进行比较,返回最“相似”Ke
并尝试将其作为解密密钥。该策略假设每个人的 Stroke(或 Ke)差异很大。
上述策略是从生物特征加密中借用的,您将生物特征数据存储在数据库中并使用它来识别或验证个人。尝试在 Google 上搜索生物特征加密以获取更多信息。