在夏娃不知情的情况下,如何与鲍勃验证号码?


49

您需要检查您的朋友鲍勃(Bob)是否输入了正确的电话号码,但是您不能直接问他。您必须将问题写在卡片上,然后交给伊夫,夏娃将把卡片带给鲍勃,并将答案返回给您。除问题外,您还必须在卡上写些什么,以确保Bob可以对消息进行编码,以使Eve无法读取您的电话号码?

注意:该问题在“ Google面试问题”列表中。结果,网络上有成千上万个此问题的版本,其中许多没有清晰甚至正确的答案。

注2:这个问题的狡猾答案是鲍勃应该写“给我打电话”。是的,这非常聪明,“开箱即用”,无所不包,但是没有使用CS领域中我们称之为英雄“鲍勃”和窃听对手“夏娃”的任何技巧。

更新:
您和Bob都可以手工合理完成的算法的加分。

更新2:
请注意,鲍勃不必向您发送任何消息,而仅需确认自己具有正确的电话号码,而夏娃无法对其进行解码,因此可能会或可能不会导致更简单的解决方案。


1
但是“打电话给我”根本没有意义,他还没有您的正确电话号码,或者至少您不确定他是否有电话号码,所以我认为这不是很聪明。
Gigili 2012年

1
@Gigili如果您接到他打来的电话,则他有您的电话号码,如果您没有接到电话,那么他就没有电话。
2012年

1
啊对。我仍然认为这并不聪明!
Gigili 2012年

另一个嘲讽的答案可能是凯撒密码。即使夏娃尝试了所有可能的偏移量,她也没有理由选择一个数字序列而不是另一个数字序列(只需尝试调用所有数字)。
拉斐尔

2
@Raphael是不是只有十个凯撒密码适用于数字?

Answers:


27

首先,我们必须假设夏娃只是被动的。通过这种方式,我的意思是她如实地将卡片发送给了Bob,而带回给Alice的任何事情的确是Bob的回应。如果Eve可以在一个或两个方向上更改数据(并且她的动作仍然未被检测到),那么一切都会进行。

(为了遵守长期的传统,参与对话的两个诚实方称为爱丽丝和鲍勃。在您的文字中,您说的是“您”。我的真名不是“爱丽丝”,但我会像您写的那样回应该爱丽丝想验证Bob的电话号码。)

简单(但较弱)的答案是使用哈希函数。爱丽丝在卡片上写道:“还给我您电话号码的SHA-256哈希”。SHA-256是一种加密哈希函数,就哈希函数而言,它被认为是安全的。手工计算将是乏味的,但仍然可以进行(这大约是2500个32位操作,其中每个操作都是加法运算,字移位或旋转或位的按位组合; Bob应该能够在一天或一天​​之内完成该操作)所以)。

现在那有什么弱点?SHA-256是一种加密哈希函数,可抵抗“原像”:这意味着,在哈希输出的情况下,很难恢复相应的输入(这是Eve面临的问题)。但是,“非常努力”表示“最简单的方法是蛮力:尝试可能的输入,直到找到匹配项”。麻烦的是,这里的暴力很容易:可能的电话号码很少(在北美,这是10位数字,即只有100亿个数字)。鲍勃想手工做事,但我们不能认为夏娃是如此有限。一台基本的PC 每秒可以尝试数百万个SHA-256哈希因此Eve将在不到一个小时的时间内完成(如果使用GPU,则不到5分钟)。

这是一个普遍的问题:如果Bob是确定性的(即,对于来自Alice的给定消息,他将始终返回相同的响应),Eve可以模拟他。也就是说,夏娃除了知道电话号码外,还了解鲍勃的一切,因此她实际上经营着100亿个鲍勃,他们的假定电话号码不同。她等待虚拟的Bob之一返回真正的Bob实际返回的一切。该缺陷影响许多类型的“智能”解决方案,其中包括随机随机数和对称加密以及诸如此类的东西。这是一个强大的缺陷,其根源在于巨大的差异在计算夏娃和Bob(现在,如果Bob之间的权力有大如夏娃的一台电脑,那么他可以使用通过多次迭代使用哈希函数;差不多就是密码哈希,用电话号码代替密码;参见bcrypt以及此答案)。

因此,非弱解必须在Bob方面涉及一些随机性:Bob必须反复掷硬币或掷骰子,并将值注入他的计算中。此外,夏娃必须不能弄清鲍勃的所作所为,但爱丽丝必须能够弄清楚,因此某些信息是从鲍勃秘密传递给爱丽丝的。这称为非对称加密,或者至少称为对称密钥协议。那么,该类中最简单的算法(但仍相当安全)可以算是具有PKCS#1 v1.5 padding的RSA。RSA可以使用作为公共指数。因此,协议如下:e=3

  • Alice生成一个大整数,其中和是类似大小的质数,因此的大小足以确保安全(即,截至2012年,至少为1024位)。同样,爱丽丝必须安排和不能为3的倍数。p q n p 1 q 1n=pqpqnp1q1

  • 爱丽丝在卡上写。n

  • 如PKCS#1所述,Bob首先将其电话号码填充为一个长度为的字节序列(这意味着:00 02 xx xx ... xx 00 bb bb .. bb,其中bb是编码的十个字节电话号码和“ xx”是随机的非零字节值,如果是1024位整数,则总长度为128个字节)。ñnn

  • 鲍勃将其字节序列解释为大整数值(大端编码),并计算(因此,这是一个非常大的整数的乘法运算,然后是除法,结果是除法的其余部分)。仍然可以手动完成此操作(但是,再次执行可能需要一天的大部分时间)。结果就是鲍勃发回爱丽丝的东西。m 3 m o d nmm3 mod n

  • 爱丽丝利用她对和知识从鲍勃发送的恢复。RSA上的Wikipedia页面对此过程有一些合理清晰的解释。一旦爱丽丝有了,她就可以删除填充(“ xx”非零,因此第一个“ bb”字节可以清楚地定位),然后有了电话号码,可以将其与自己的电话号码进行比较。q m m 3 m o d n mpqmm3 mod nm

爱丽丝的计算将需要一台计算机(一台计算机通常总是基本的并且可以手动操作,但是一台计算机的速度非常快,因此“可行”在实践中可能会花费太多时间;手工进行RSA 解密会花费很多时间周)。

(实际上,通过使用McEliece加密,我们可以进行更快的手动计算,但是随后,公钥(爱丽丝在卡上写的内容)将会很大,而卡根本就不会这样做;夏娃必须运送整本书的数字。)


1
快速评论一下,第一个协议的另一个缺点(爱丽丝说“给我发送电话号码的哈希”)很容易受到重放攻击。如果您是在现实世界中实现此操作,则Alice应该发送随机字符串(称为“ nonce”),该字符串随电话号码一起散列。
别名2014年

1
您说过,如果Eve可以修改消息,则“一切皆有可能”,但这不一定是丢失的原因。使用RSA,我们实际上还可以保护邮件免受MITM攻击。发送一个问题:“您有我的电话号码吗?”,再加上公共密钥,再加上用私钥签名的(消息+您的电话号码)签名。如果Eve尝试修改消息(将公共密钥更改为她自己的消息),则由于她不知道您的电话号码,因此将无法生成有效的签名。
stevendesu 2014年

15

看起来像RSA这样的公钥密码系统的经典应用程序。

您将公共密钥一起发送,BoB会从他的联系人列表中加密您的电话号码,然后将其发送回给您。


5
考虑到鲍勃和夏娃,这可能应该是关键思想。在这种情况下(铅笔和纸)可行吗?另外,我希望链接到带有“本文需要编辑”标志的维基百科文章。
2012年

@Joe:我已编辑为包含另一个链接。我很确定您听说过RSA。RSA可能足够实用,因为写成1000位数应该不需要太多时间。
Aryabhata'3

14

您可以做的最基本的事情之一就是Diffie-Hellman密钥交换。它不需要您在通信开始之前设置密钥,因为它以一种听众无法自己导出密钥的方式进行协商。有关详细信息,请参见全面的Wikipedia文章

您发送Bob DH参数和(是一个合适的大质数,通常是一个小数)和公共密钥,其中是一个大秘密数(这是您的私钥),以及鲍勃发送以下内容的说明:g p g g a m o d p apgpggamodpa

  • 他的公钥,其中是他选择的一个很大的秘密数字;bgbmodpb
  • 他相信的是您的电话号码,该电话号码使用对称加密算法进行了加密,并使用了从共享机密派生的密钥进行加密。gabmodp

夏娃可以看到和,但是实际上无法计算。g b m o d p g agamodpgbmodpgabmodp

只要实施得当并且通信者和攻击者都拥有大约相同的计算能力,这是安全的。


2

鲍勃不必发送任何您可以解密的消息。他只需要向您证明他有您的电话号码即可。因此,加密散列函数(单向加密)提供了公钥加密系统的替代方法。SHA-2当前是此类功能的流行示例。

在这种策略下,您无需解密Bob传给您的消息。您告诉鲍勃您希望他使用哪种哈希函数,例如“鲍勃,请使用SHA-2加密我的电话号码,并将夏娃的结果传回给我”。然后,您使用相同的算法对您的电话号码进行哈希处理,并检查是否获得了与鲍勃相同的哈希值。两个不同的电话号码极不可能导致相同的哈希值,因此您可以确定Bob是否具有正确的电话号码。

如果您,鲍勃和夏娃没有可用的计算机来计算散列函数(或执行蛮力攻击),则可能可以使用散列函数牺牲一些安全性来抵御蛮力攻击,但对您和鲍勃来说要容易得多计算。


我在写同样的答案!倒霉 我会花时间在上面贴它。
Gigili 2012年

@Gigili我希望有人能写下这个答案,但是我决定当我看到还没有人提供这种选择时……我仍然在寻找一种铅笔和纸张友好的版本。老实说,我不想让我的朋友用手做RSA或SHA-2。
2012年

问题在于,夏娃会加密所有可以手动完成的简单算法。
Gigili 2012年

@Gigili您的意思是“被夏娃解密”吗?这个问题非常有限。似乎应该有一个由7位整数组成的更简单的单向散列,Eve不能仅仅撤消以获取原始数字。
2012年

糟糕,我的意思显然是解密。
Gigili 2012年

0

一个简单的解决方案是:

爱丽丝和鲍勃都同意使用相同的颜色。如果夏娃知道那个,那没问题,我们称它为P。假设它是黄色的。现在,爱丽丝和鲍伯都随机选择一种私人颜色,例如“ x”。爱丽丝选择红色,鲍勃选择蓝色。现在他们将它们与P混合在一起。爱丽丝现在有橙色,鲍勃有绿色。爱丽丝(Alice)将橙色发送给鲍勃(Bob),鲍勃(Bob)将绿色发送给爱丽丝(Alice),夏娃现在知道黄色,橙色和绿色,但是爱丽丝(Alice)也知道自己的红色,鲍勃(Bob)知道了他的私人颜色(蓝色),其他人都不知道。爱丽丝(Alice)和鲍勃(Bob)都采用原始的私人颜色,并将它们添加到刚刚交换的颜色中。现在,如果他们将原始的私人颜色(红色和蓝色)混合到共享颜色中,那么它们最终都将具有相同的颜色,即棕色或砖红色。

您可以使用而不是将颜色混合在一起, 这样p是一个大质数,而g是p的原始根,因为如果对任何x 都进行,结果(0到p-1之间的数字)很可能是其中任何一个,这就是为什么存在原始根的原因。如果p是2n + 1的质数,使得n也是质数,那么您知道2是p的本原根(这意味着您不必费心计算该本原根,这很困难),因此共享秘密=鲍勃,和爱丽丝。Xgx(modp)Xgx(modp)ÿAx(modp)By(modp)


我认为您可以在卡上写这样的内容:

该数字是3,5和7的倍数(例如)。

有(是位数)的可能性,对于那些知道它的人来说,这个想法只会使一些可能性无效。因此,夏娃不会进行解密。 n(10)nn


这是在Diffie-Hellmann密钥交换的Wikipedia文章上找到的图像的旁白。您至少应该提及您的出处。
拉斐尔

@Raphael:我自己并不知道,有人向我解释了它,我认为这是个好主意。
Gigili 2012年

0

只需让Bob将数字乘以2或3或其他任何值,然后将该数字与数字本身进行异或即可。如果已知该数字,则可以手动完成,并且可以逆转。没有sha,rsa或md5。只是简单的数学。


3
这个答案是错误的。简单,手工操作且完全不安全。只是简单行不通。夏娃可以从中恢复很多有关电话号码的信息。
DW

0

向Bob发送用您的电话号码加密的密码字;如果他发给您密码字,您知道他有正确的号码。

缺点是夏娃可以模拟鲍勃,因此只需尝试每个电话号码,直到她得到鲍勃返回时提供一些代码字的电话号码为止。

因此,请让Bob在代码字后面附加一个非常大的随机数,然后对其进行加密,然后再将其发送回给您。这样,Eves的搜索空间就可以达到您想要的大小。


这似乎不正确。如果Bob的号码错误,他将首先解密并获得错误的代码字。之后,他将随机数附加到代码字上,并使用错误的密钥进行加密。当使用正确的密钥接收并解密该消息时,即使Bob的号码有误,恢复的消息的第一段也可能是正确的代码字。
通知2014年

@randomA您只需要使代码字足够长,以至于发生这种情况的可能性非常小,因此您不必理会它。
伊恩·林罗斯

您说的是正确的,但是所选的解决方案在这个问题上也非常好。我只会不同意“将某些信息从Bob传递给Alice的机密信息”这一部分所选择的解决方案。如果使用的填充消息足够大并且不包含用于表示电话号码的符号,则Bob可以将电话号码随机放入其中,而Alice可以轻松地从解密的消息中恢复电话号码,而无需知道Bob采取的随机步骤(在这种情况下,不需要机密传达的信息)。
通知2014年

-1

我将在卡上写一些10个电话号码,其中的一个将确保 我的电话号码紧接Bob的电话号码, 并且我会提到“嘿Bob,我的电话号码在您的电话号码旁边,请验证” :)


1
假设我知道鲍勃的电话号码,但夏娃不知道:P
everlasto

-1

我认为这个问题比每个人都想的简单得多。我们需要验证Bob的号码是正确的(或者可能是错误的)。由于我们正在“检查”号码是否正确,因此可以假定鲍勃已经有了您的号码。因此,无需通过某些代码向Bob发送您的电话号码。我的回答是:“亲爱的鲍勃,请给我电话。谢谢,爱丽丝”


1
这个问题已经明确排除了这个琐碎的答案。
David Richerby 2014年

-2

尝试像这样玩特技

解决方案1:如果数字为37,则哈希映射将如下所示

01 07

15 12

25 20

31 36

49 43

53 50

60 62

72 72

85 82

91 94

并用10位数甚至更多来做同样的事情,只是为了混淆:P

解决方案2:或构造一个多项式,使您的数字成为其他唯一数字

solution3:写在“花花公子打电话给我”的信中

solution4:以这样一种方式编写一个函数,使其对每个数字进行运算并返回0,然后他发送对或错的解决方案5:如果两端共享一个共同的哈希函数……这将使生活变得非常轻松


这都不明显你是如何计划码37
大卫Richerby

我们需要做的就是地图... 31以粗体表示3处于位置1 .... 72表示7处于位置2 ...很抱歉,如果不是很直观的话
Ajay Reddy 2014年

这应该在答案中详细解释。但是,严重的是,如果这是您的编码方案,那不是完全安全,是吗?
大卫·里奇比

-2

我认为我们可以通过使用基本的按位操作来做到这一点,或者可以针对纸张和铅笔工作对其进行自定义。如果alice的数量是ex,例如:663,那么她只能使用此方法转换数字。将每个数字转换为等效的二进制表示形式,将其表示为A 663-> 110 110 011,然后将每个单个数字的对应位取反,将其转换为B-> 011 011110。现在执行A和B-> 010 010 010。 bob要求相同的结果,如果结果相同,请问他说是或否。在这种情况下,前夕将无法解码该数字,并且以相同的表示形式出现不同数字的可能性很小。夏娃只能猜测的方式是编写所有可能的组合,然后尝试所有组合,以迎合我们可以通过使用向左或向右移位并添加虚拟位来使其更加复杂的情况。


这行不通。首先,每个3位组的中间位保持不变。其次,传输消息的每一组的第一和第三位将始终相同,通常为零,这将导致很多误报。第三,也是致命的是,三个位只能表示八个值,但是十进制数字可以采用十个值中的任何一个。第四,您的最后一句话实质上是:“哦,如果不行,请尝试更复杂的事情。” 如?
David Richerby

-3

请给我打电话(我的名字是1001001)。如果您无法与我联系,请写下您拥有的电话号码,并要求夏娃归还我。

说明:如果Bob得到了我正确的#号,他可以联系到我,那么我知道这是正确的#号;如果Bob没得到我正确的#号,Eve也无法读取我的(正确的)电话号码。这样,我已经检查了我的朋友鲍勃(Bob)是否具有我的正确电话号码。


到everlasto:Eve可以联系Bob,以便很有可能获得他的#。因此,如果您问“嗨,鲍勃,我的电话号码在您的电话号码旁边,请验证”,夏娃就会知道您#。
Pobol Wong 2014年

1
该问题明确指出,您不能只给鲍勃发一张卡片,说“给我打电话”。如果鲍勃打不通,鲍勃在卡上写了错误的号码,则不会添加任何东西。
大卫·里奇比

我以前写过LZW编码/解码程序。我可能会要求Bob使用它向我发送电话的编码#,也可以使用它向他编码我电话的正确部分。
Pobol Wong 2014年

给David Richerby:这个问题只提到“您不能直接问他”,这意味着我1001001,不能直接问Bob,但是应该可以问他用他接到的电话给我打电话。
Pobol Wong 2014年

仔细阅读问题。问题中的“注释2”拒绝发送注释以要求鲍勃给您打电话的解决方案,因为它不使用任何计算机科学。
David Richerby 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.