The problem here is that the key that is used for encryption (the Stroke or something derived from the Stroke) must be sent along with the encrypted message. Otherwise, there is no way for the decryption protocol to compare the decryption stroke with the original.
So suppose Alice wants to encrypt some message M
. She is the only person who should decrypt the message, so Bob is not in the picture. Alice generates a fuzzy encryption key Ke
and encrypts M
to become Me
: Encrypt(M,Ke) = Me
. The message that is sent is (Ke,Me)
. On the receiving side, Alice produces fuzzy decryption key Kd
. Some algorithm checks that Ke ~ Kd
and Me
is decrypted: Decrypt(Me,Ke) = M
. Note that this is symmetric encryption; Kd
is only used to check that it is 'sufficiently equal' to Ke
.
Of course the problem is that Ke
is sent in cleartext along with the message so Eve can simply take the key and decrypt Me
. However, Ke
is needed on the receiving side to compare it against Kd
. So how do we send Ke
along with the message without Eve being able to eavesdrop? We could create a hash of Ke
and send that over the line: (Hash(Ke),Me)
. However, on the receiving side there would be no way to verify 'sufficient equality' between Ke
and Kd
based on Hash(Ke)
.
We could device some algorithm that generates a value based on Ke
such that if Ke ~ Kd -> V(Ke) ~ V(Kd)
(if Ke
and Kd
are similar then the generated values are similar). We send the message (V(Ke),Me)
to the receiver. However, it would now be relatively easy for Eve to determine Ke
based on V(Ke)
. She starts with a random candidate key: KeC
and using our algorithm, determines a V(KeC)
. If it doesn't look at all like the V(Ke)
in the message, she makes some drastic changes to the candidate KeC
and tries again. As she comes closer to the message's V(Ke)
she makes smaller changes to KeC
, etc.
So it is impossible to create a secure encryption scheme if we allow Ke
to be sent along with the message. This means that Ke
has to be given to Trent, the trusted third party. In this case, Trent can be the application's database. So now the scheme becomes as follows:
Alice generates Ke
, a message M
and a unique id Id
. Ke
is stored with Trent, our database, along with Id
. M
is encrypted using a regular encryption scheme that uses Ke
as key: Me = Encrypt(M,Ke)
. The message sent to the receiver is (Me,Id)
.
On the receiving side, Alice receives the message (Me,Id)
. Alice generates Kd
. Based on Id
, we get the corresponding Ke
from Trent and compare it with Kd
. If there is a match, we decrypt Me
: M = Decrypt(Me,Ke)
.
The only problem now is when you have an intruder Mallory with access to Trent. He can ask Trent for Ke
values based on random id's. To prevent this, you shouldn't include Id
into the message so that the message simply becomes (Me)
. Now you would have to come up with a strategy to get candidate Ke
's from Trent only by using Kd
. This is of course possible because you can compare Kd
with all Ke
's in the database, return the most 'similar' Ke
and try that as the decryption key. This strategy assumes that each person's Stroke (or Ke) is sufficiently different.
The strategy above is borrowed from biometric encryption where you store biometric data in a database and use that to either identify or authenticate individuals. Try searching Google for biometric encryption to get some additional info.