我正在寻找一种可以由人类仅使用纸和笔进行计算而又不会泄漏任何有关纸上明文的信息的密码哈希函数。满足以下属性:



输入/输出:任何输入/输出集都是可以接受的,只要人类可以表示并在文本和文本之间进行转换(例如,base- 2 <-> ASCII码是可以接受的。)

内存:请记住,人类可以在工作内存中容纳大约7±2个对象,该算法所需的块数不得超过11个(例如11位数字,字母或常用词)。不需要保密的数据可以卸载到纸上。假定可以从存储在人脑中的安全只读内存中随机访问纯文本。一天。不到一个小时会很棒。不到一分钟,太棒了。

材料:假设可以使用笔和纸。预先计算的表格(例如用于S盒的表格)是不可取的,但可以接受;最好是可以从易于记忆的压缩表示中重新计算的表。魔术数字或其他预先计算的数据也是如此。

安全性:哈希函数应具有抗预映像的能力。

侧通道攻击:纸张(或除大脑之外的任何其他介质)在任何时候都不得包含泄露明文信息(燃烧)的数据之后的纸张不足;假设在整个计算过程中,纸张的状态都由对手监视。

指令集:处理工具是人的大脑,操作必须由典型的数学/ CS研究生(有实践)执行。假设人类可以执行一位数的base-64算术(一组$ 64 ^ 2 $映射可以在一年内通过间隔重复来轻松学习)可能会很有用。

描述:如果该算法可以记忆(连同所有预先计算的表格和幻数的表示),那将是很棒的。否则,最好将描述放在A4纸的两面(用文字,图表或其他方式表示)。

当前主流的加密哈希函数当然可以接受,只要有算法计算它们满足列出的属性。

深奥的指示是可以接受的。例如,如果算法中需要大量安全内存的某些部分可以在同构方案下完成,而同构方案只需要执行很少的安全内存(即所有东西都可以卸载到纸上而不会泄漏明文的风险),然后去吧。 (这样的事情大概需要一个密码随机性的来源。没关系:人类可以记住一个没人知道的高熵字符串。)

对于这个问题的限制较少,允许访问现代计算机,但假定所有输入,输出,内存和指令均受到对手的监视(因此,不允许输入sha512sum <plaintext>,因为这会泄漏明文)。使用任何标准的Unix工具或语言。确保输入和输出不受任何干扰。通过存储一个高熵密钥并计算$ \ operatorname {hash}(\ text {key} \ mathbin {\ |} \ text {salt})$到安全的计算机,其中$ \ text {salt} $为每个密码短语唯一的易于猜测的字符串。

crypto.SE上也有一些类似的问题。下面我概述了这个问题与每个问题的不同之处:

是否存在一个无需计算机即可计算的简单哈希函数?是否有足够强大的笔纸或思维密码?
我更多地关注安全性和旁道攻击,而不是速度和简单性。

是否存在可以在精神上执行的安全密码系统?散列函数,而不是加密协议。

用于外部匿名调查的笔纸单向函数
这个问题是在寻求一种快速,简单的陷门功能,我不是寻找。

评论

您能否解释一下为什么您有旁通道约束?这似乎与我要达到的目标模型不符。原始(敏感)信息与用户一起写在纸上。为什么他们不能创建其他敏感信息,然后破坏它或将其与原始信息一起保留?

@Michael我不确定您所说的原始敏感信息是什么。我在考虑这样一种情况,即纯文本仅存在于用户的脑海中,而在其他任何地方都没有记录。

啊哈,我明白了。可能值得将其纳入问题中-我将只读随机存取存储解释为带有消息的纸片。如果您有一个示例使用场景,那将很有趣。

@vyu-如果有实际应用,请更好地解释环境:假设您处于不安全的环境中,并尝试重新生成PW。您仅这样做是为了找回私用PGP / X.509密钥,然后再使用这些密钥解密密文或处理明文。使用重新生成的PW解密密钥或进行后续操作都需要一台计算机,并且该计算机上没有其他机密,因此它必须是安全计算机。为什么还不能在该计算机上重新生成散列的PW?为什么只允许心理PW解密?

白盒纸笔哈希算法?听起来真的很难。

#1 楼

查看Manuel Blum的人类可计算哈希函数。他称其为“人类可计算机器坚不可摧的HCMU”。 />
需要记住的是记住每个字母到0到9范围内数字的随机映射。您还需要记住从0到9的随机排列。这些保持不变对于每个要散列的字符串,因此您只需记住一次即可。

哈希函数涉及将输入字符串映射到数字,执行简单的加法函数,然后在您记忆的随机排列中查找值。他有证据表明,计算机很难破解哈希值。

http://www.heidelberg-laureate-forum.org/blog/video/lecture-monday-september-22 -2014-manuel-blum /

评论


$ \ begingroup $
该哈希函数是否有文字说明?我不想看一个小时的视频,因为它几乎肯定不能满足OP的要求。学习同时记住60多个位可能是可能的,但是肯定需要付出很多努力。
$ \ endgroup $
– CodesInChaos
2014年10月30日10:25

$ \ begingroup $
发现这个问题时,我正在搜寻该算法的纸本版本。尚未找到论文。我修改了答案,以包含更多详细信息。
$ \ endgroup $
–亚伦
14-10-30在23:47

$ \ begingroup $
找到了scilogs.com/hlf/mental-cryptography-and-good-passwords的描述
$ \ endgroup $
–亚伦
14-10-30在23:52

$ \ begingroup $
布鲁姆(Blum)和达塔(Datta)的博士学位。的学生Jeremiah Blocki写了一些关于他们的工作(但我认为不是关于Blum谈论的特定算法):1)可用的人认证,2)人工可计算的密码。 (@Aaron:非常感谢您提供此演讲!)
$ \ endgroup $
– Vincent Yu
14-10-31在11:33



$ \ begingroup $
我对该计划的理解是它需要一个秘密。
$ \ endgroup $
–fgrieu♦
20年5月11日在14:33

#2 楼

此要求是致命的:


纸张(或除大脑以外的任何介质)在任何时候都不得包含泄露有关纯文本信息的数据。


几乎所有用于哈希的安全证明都假定对手只能看到摘要,而不能看到中间状态。中间状态没有足够的混乱和扩散,因此会泄漏信息。

这意味着必须牢记所有秘密状态,并且必须在头脑中对秘密状态进行所有计算。老实说,我想我在对它们执行复杂的加密例程时最多可以记住8个数字(在整个例程中笔和纸跟踪进度)。这意味着最大约26位的安全性,所以这不可能是安全的。

所有假设某人实际上可以描述可以使用心理操作完成的安全哈希方案。 >

评论


$ \ begingroup $
白盒密码学是一个研究主题。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
13年8月17日在17:25

#3 楼

我仍然不理解您对散列的渴望,尤其是考虑到(如本论坛其他地方已经提到的那样)您通过将PW
接受诸如散列之类的确定性函数不会获得任何熵。因此,在解密密文时,使用H(key)和(key)一样安全,因此,您最好还记住一个长密码短语和一个随机字符串以作好准备。我强烈感到,由于需求如此复杂且想法有些晦涩难懂,因此需要面对面才能真正了解所需应用程序的细微差别。发现对您要完成的任务有用。它并不是真正的哈希,但有望提供您所需要的机制。我在这里使用您的术语-“ key”作为输入字符串,“ passphrase”作为输出字符串:
(注意:我将仅列出解密阶段,以对抗对手。加密将是相似的,但是可以可以按照问题中的说明进行计算机处理)
初始化:

在一张纸上放置一个随机字符的方阵,16行x 16列,总计256个字符。
记住一个好的密钥,其中包含2个长度相等的不同逻辑部分,例如“ Johnny%rides || yellow + zebra”(或者,记住2个长度相同的单独密钥)。我在这里只是出于演示目的使用短弱键。
存储一个随机字符串(最好包含一些高ASCII字符,例如外币符号)
学习并存储7位十进制(或十六进制)ANSI等效项95个字符集(我假设您使用英语作为密码短语)。易于执行,因为它们是顺序的(可以在纸上放入完整的ASCII表查询)
学习并记住随机字符串中字符的7-8位十进制(或十六进制)表示形式(可以将完整的扩展名放入在纸上的ASCII查找表)。

解密(执行流OTP +替换):

将密钥分为两个不同的逻辑部分,例如A部分:“ Johnny%rides”和B部分:“ yellow + zebra”
在每个部分的相同位置上取一个字符,并将其转换为等效的十六进制。例如分别将“ J”和“ y”分别转换为0x4A和0x79。 />取B部分字符的十六进制值0x79,并使用其2个十六进制元素作为写入随机表的(x,y)索引。小心地从单元格中取出随机字符,并将其转换为十六进制等效项。
小心地获取A部分的字符的十六进制值,即0x4A,并对提取的单元格值的十六进制表示执行XOR。本质上,在密钥的A部分和随机值之间进行OTP加密。
使用该十六进制值作为所需密码的第一个字符,将其记录下来,使您的大脑不再记住它。该过程具有键的每个部分的下一个字符,但是对于每个连续的字符,您需要增加从中拉出随机单元格的行,以阻止由于B部分中存在英文单词而导致的频率分析-索引

上述过程需要最少的内存和智力负荷。完成后,您将拥有完整的密码短语。您可以通过向每个拉出的单元格值添加另一个单元格值(例如,从第一个着陆单元格通过“骑士移动”选择的值)增加密码短语的大小,以将Part A大小增加一倍(或更多),如象棋游戏。 br />应用笔记:
如果准备更大的随机矩阵,并使用B部分的2个连续字符(mod表大小)作为索引,可以提高安全性。
另外,如果可行,您应该准备几个随机表并依次使用-每个表都与一个不同的键相关联。
您最初存储的一个随机字符串可以以创造性的方式使用-作为随机变量的另一个索引表,将A部分的结果与结果进行串联或异或。
注意:我希望我在这里提出的内容在某种程度上是您想要的。我没有花时间分析该建议的加密强度。它可能有严重的缺陷,但这是我在合理的时间内提出的最好的方法。
在将其投入实际使用之前,必须评估它的安全性,不足和有用性。

#4 楼

不,没有像这样的任何加密哈希函数。我非常有信心您不会找到一个。我还没有看到白盒安全散列函数,该函数对于特定的攻击仍然保持安全,更不用说可以在铅笔和纸上安全实现的函数了。由于这是一个实际问题,我建议您找到另一种解决方案-例如在您信任的计算机上对密码短语进行哈希处理。

评论


$ \ begingroup $
编写一个定制的Android / iOS应用为您做到这一点并不难,尽管您是否应该信任个人电话完全是另一回事。实际上,真正的奉献者可以使用Arduino创建一个小型硬件设备,这听起来像是一个不错的业余项目。
$ \ endgroup $
–里德
13年8月18日在18:22

$ \ begingroup $
我在您对这个问题的回答上打了个勾号,并决定加分。答案是完全正确的,提到了白盒,并且正确地暗示未根据此威胁模型设计密码哈希函数。
$ \ endgroup $
–user4982
13年10月3日在18:05

#5 楼

我不确定它的安全性(在此处发布可能会至少降低其安全性),或者不确定它是否必须甚至被称为哈希函数,但是在输入/输出(键盘键),内存(I考虑一下一次要操纵的片段之外的3个块),速度(几分钟即可产生8-16个字符),材料(键盘),侧通道攻击(仅记录输出),指令集(视觉操作),我认为几年前我提出的用于生成密码的算法很难被破解。

英文字母中有26个字母,恰好是1小于33。向下看(QWERTY)键盘。现在看着我。您刚刚看到的是三行字母,每行包含10、9和7个字母。小心地将“ P”向下移动到“,”所在的位置,现在每行中有9个或更少的键。现在,将键盘分为三个区域,每个区域包含3列。现在,每个键都可以由以3为基数的3元组来表示,该3元组在节中指定行,节和列。不用担心,您将不需要写下3元组,甚至不需要知道什么是元组。该位仅用于说明目的。基本上,您想创建这种心理形象:


您需要的另一件事是种子词。对于密码,5个字符将生成10个数字的5个字母数字组合(如果您不介意仅在输入的中间部分进行哈希处理);如果您想对更长的哈希进行哈希处理,显然将需要更长的种子。在键盘上找到字母。我分别使用“ D”和“ B”作为输入和种子。

现在,您无需将字母转换为坐标!您只需要一次找出一个坐标。而且不要以为它们是1,2,3,以为它们是(左,中,右)和(上,中,下),或者更好的是,根本不考虑它们。只是描绘他们的位置。为了说明起见,我还是要转换它们:

现在,要重新组装输出,我们需要将每个输入的片段映射到我们的输出。具体如何完成将由用户确定;只要确保您每次始终以相同的方式进行映射即可。并确保使用输入中的至少一个组件和种子中的至少一个组件。

示例映射可能是(input column -> output section, seed row -> output column, input section -> output row)。在头脑中进行这种操作的一种简单而又令人难忘的方法是,将旋转/滑动的每个输入图片描绘到其在输出上的映射位置(从映射到输出部分的任何内容开始,通常通常最容易做的是映射到什么)。

所以(由于动画超出了我现在的能力范围):


输入(D)列(右):A, S和D展开以对应于左,中和右部分。在右侧部分中查看后续步骤。
种子(B)行(底部):T,G和B旋转到水平位置并滑到右侧部分,它们对应于以U为标题的列, I和O。描绘O列中发生的最后一步。
输入(D)部分(左):左,中和右部分收缩并垂直旋转以覆盖O,L和P(其中是从第一行借来的)。输出字母为O。

现在,我保证输出的是字母和数字。别忘了我们只使用了6个可用坐标中的3个。您可以将其余三个坐标中的两个映射到数字行,该行分为3行,每行3个数字(忽略0或您不会碰到的任何其他数字)。剩下一个坐标,您可以用它来确定在敲击字母,数字或数字或两者时都应按住Shift键,或者两者都不用(4个选项中只有3个可用,因此请明智地选择)。我确实建议让该坐标来自种子,因此如果您为此目的使用密码,则可以选择一个种子词来确保密码适用性。

我确实看到了反向工程的一些潜在问题您的算法/种子,是否有人可以持有足够的输入/输出对;但希望所使用的方法能够使它变得难以理解。如有需要,您始终可以使用其他坐标映射或种子词。就像我说的那样,我不知道这对于除密码之外的其他任何东西是否足够安全,但是对于那些可能难以进行更复杂的计算的人来说,这可能很有用。而且没有记录任何中间步骤!

评论


$ \ begingroup $
如果在此处发布此内容完全降低了安全性,那么它至少部分是通过模糊性来依赖安全性,这是一个很大的禁忌。
$ \ endgroup $
–森林
18 Mar 24 '18在5:54

$ \ begingroup $
嗯,我实际上不知道它有多强大。这就是为什么我决定把它放在那里,看看别人可能会怎么想的部分原因。
$ \ endgroup $
–特雷沃尼(Trevortni)
18年3月24日在6:41

$ \ begingroup $
另外,我不认为有一种安全算法不会因人们知道它的工作原理而降低安全性。如果您知道需要花费宇宙的一生来寻找所需的素数,那么至少您知道您正在寻找素数。问题是,假设掌握基本算法,它的安全性如何。
$ \ endgroup $
–特雷沃尼(Trevortni)
18 Mar 26 '18在20:02

$ \ begingroup $
你为什么这么认为?以GCM,Poly1305或OTP为例。这些都提供了信息理论上的安全性。也有证据表明,对算法的给定更改不会降低安全性,例如HSalsa20和XSalsa20。还请记住安全性证明,它归结为证明算法与给定的硬度问题一样安全(RSA就是一个例子)。请记住Kerckhoffs开发安全密码系统的第二条原则。
$ \ endgroup $
–森林
18-3-27的1:53

$ \ begingroup $
我同意“了解密码系统X会稍微降低其安全性”并不一定是坏事。如果我不知道Diffie-Hellman是如何工作的,我将很难。这是否意味着我们不应该使用Diffie-Hellman?相反,您不应该主要依赖模糊性(非模糊性可以通过允许其他人识别弱点来帮助安全,因此您可以对其进行修复)。另外,在麻省理工学院安全性讲座(youtube.com/…,我忘记了哪个视频)上,晦涩难懂对于本来就很强的加密货币来说是很有用的。
$ \ endgroup $
–Erhannis
19年3月20日在21:25