用绘制的笔画解密数据的算法

标签 algorithm encryption drawing

假设我在 iPhone 上有一个加密文件,每次我想解密它时,我都想“绘制”一个解密符号,而不必使用键盘输入。

如果您要求用户在每次需要时(例如,每次他们启动您的应用程序时)都要求用户绘制一个符号来解密文件,那么他们可能更喜欢必须在小键盘上输入 20 个字符左右的密码,并且他们仍然会获得安全性 20 个字符的密码会给他们(取决于他们绘制的形状/符号的复杂程度)。

他们绘制的符号很可能是一笔(例如,一旦你抬起手指,它就结束了)但可能非常复杂,以至于其他人很难重复它,即使他们看到你画了它。就像每个人的签名都是独一无二的,难以复制一样。实际上,如果它必须防止被复制,这可能会使它过于复杂,所以现在可以忽略它,我们可以假设其他人不会看到该符号,因此它是否可以重复并不重要由他们与否。

我想真正的问题是你如何将相同的(合理的)笔画一致地转换为相同的键(例如哈希值)。算法中显然应该有一些宽恕阈值,因为不能期望用户准确地 100% 重复笔画。

使用符号作为解密方法为这个问题增加了另一个维度。您永远不想以未加密的形式将生成的哈希值存储在任何地方,因为这样有人可能能够访问硬盘驱动器的那部分并获取解密 key ,而无需完成整个绘图过程并手动解密文件。您也很可能不想存储有关如何绘制形状的任何信息。

用户可能用作其解密符号的笔画的一个很好的例子是“&”符号。想象一下,用户每次需要解密文件时,都会在他们的 iPhone 上绘制这个符号。每次绘制时,符号的大小可能都不相同。此外,符号的旋转可能会有所不同,具体取决于用户握持设备的方式。理想情况下,在这两种情况下,由于绘制的符号,相对于用户笔画,相同,应该能够生成相同的哈希值从而解密文件。

我认为像形状或字符识别这样的算法是一种类似的算法。用户绘制一些东西(合理地表示一个形状),然后将其固定为正确的形状,每次绘制时都会具有相同的哈希值。然而,对于这样的事情,你很可能需要一个可以绘制的形状数据库,如果你选择字母表中的所有字母,你只能得到 26 个字母。假设用户只需要绘制一个符号来解密文件,那么您的密码非常不安全,只有 26 种可能性。

我想到的另一件事是您可以将绘制的符号分解成小段,然后对这些符号进行符号识别。因此,假设您在数据库中有 4 个符号:垂直线、水平线和两个方向的对角线。现在当用户绘制时,每个段都被识别为其中之一,然后将它们全部组合起来形成一些哈希值。所以想象一下用户选择小写字母“r”作为他们的解密符号。因此,他们首先向下画一条垂直线,然后向上画一条垂直线,然后向上和向右画一条对角线。这种方法的一个问题是,您如何知道何时将笔划拆分为单独的段?您可能还想考虑每个单独段的大致长度(例如,以 40 像素为增量)。这样,如果有人画了一个变形的“r”,其中驼峰在底部附近出现,它不会被识别为相同的符号,因此不会解密文件。

第三种方法可能是将屏幕分成一个网格(还不确定哪个大小),然后简单地查看笔画是在哪些单元格中绘制的,然后以某种方式使用这些数据生成一个字符串。

关于如何实现这一点的任何其他想法?你听说过这样的事情吗?是否有任何基本缺陷会阻止这样的系统工作?

谢谢

最佳答案

使用可能有小错误的 key Material 加密数据的问题已被广泛研究。
特别是有许多使用生物特征数据(例如指纹或视网膜扫描)作为 key 来保护数据的建议。一种典型的方法是使用适当的纠错码,取出您的原始 key Material K,计算其校验子并仅存储校验子。一旦您对 key Material K' 进行了第二次读取,如果 K 和 K' 足够接近(其中“足够接近”当然取决于纠错方案),则该综合征可用于从 K' 恢复 K。

为了让您开始,这里有一篇论文提出 fuzzy vault scheme .这是使用“模糊” key 的加密方案的一般建议。当然,您仍然需要检查如何从足够稳定的图纸中提取特征以使用这种纠错方案。您还必须检查可以从这些图形中提取多少熵。尽管密码在熵方面很糟糕,但它们可能仍然很难被击败。

关于用绘制的笔画解密数据的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1616473/

相关文章:

algorithm - 如何在 Tic Tac Toe 中设置一张 table 的分数?

javascript - 处理一组顺序 bool 值

android - 无效 key 异常 : Keystore operation failed on RSA decrypt on Android device

c# - 保存加密 key 的正确方法是什么?

java - 在给定条件下查找二维数组中路径的最大长度

c - 如何使用 C 中的递归为 0,1 生成 4 位二进制组合?

encryption - 大查询中的字段级加密

c - 填充多边形

javascript - 如何找到给定 Angular 和距离的第三点

java - 卡在 Java Swing 项目 : Conway's Game of Life