我经营一个棒球联盟,想为自由球员做无声拍卖。这将要求团队输入其最高出价,并且在拍卖期结束时将获得最高出价。不幸的是,我的联盟,我的代码,我的服务器,如果我选择查看这些信息,便可以访问这些信息。我不想让自己处于那种位置,并提供这些信息。

有什么办法可以加密输入的数据,以便在特定的时间段(2天)内无法对其进行解锁?这可能吗?

另一种方法是将md5输入用户输入,但这将要求他们返回并“解锁”其出价。如果球员出价后受伤,我不喜欢这个B / c,他们会“忘记”他们的出价并且不解锁它...

我正在运行LAMP / LAPP。

UPDATE-解决方案(针对我的情况...)

要回答联盟信任问题,有三个因素。


我会作弊吗?我实际上只有b / c的最小问题,我认为我不会
联盟会认为我作弊了吗?如果他们认为我确实会引起问题,我是否会做不到
如果甜甜圈正坐在桌子上,您可以选择不吃它,但您宁愿它不坐在那里。即使您可以克制自己,这样做也不总是很愉快。我想我实际上不会作弊,但不想束手无策。

解决方案:

似乎没有什么好办法这个问题的一般解决方案。几种解决方案需要联盟大多数成员提供大量的技术知识,但事实并非如此-联盟中还有其他2位程序员。这就是我要解决的问题:

我将拍卖时间从2天延长至3天。我将在第一天出价,并用盐“ jibberish-text-salt-3.5M”出价md5,然后在拍卖页上显示该加密的文本。之后,我将不会更改出价,其他人可以在接下来的2天内出价。在拍卖结束时,我将发布我的加价出价,以便其他程序员可以确认我没有作弊。任何其他有兴趣的人都可以学习使用md5,在​​这一点上,我觉得我已经做足了让自己诚实的事情。

我无法更改我的出价,也无法尽早出价,我处于一个不利的境地-一名球员可能受伤等。为此,我正在为我提出一个向联盟提出上诉的选择,即如果发生重大事件,我的出价将被取消(因为我要等到最后一次分钟,以防止这种情况发生)。然后,联盟将对此进行投票。还有一种可能是,对我不感兴趣的人被提名,然后两天后我获得了兴趣(例如晋升为Closer)。这真的不能解释,所以为了联盟的缘故,我将冒险...

谢谢大家的建议。在这种情况下,他们没有为我工作,但我在此过程中学到了很多东西,并接触了一些有趣的新想法。

我会接受mgorven的回答,因为我感到值得信赖第三方方法是最正确的通用用例解决方案。我不确定此协议是什么...

评论

crypto.stackexchange.com/q/606/706的可能重复项(或至少那里的答案可能有用)

我有一个不可行的想法:在EC2实例上执行Cron工作。注册一个新的微型实例,将密码设置为随机字符串,这样注销一次后就无法重新登录。将密码放在发送电子邮件的python脚本中。将脚本放入cron作业中,然后注销实例。这是一个丑陋的骇客,但它的技术水平很低。

它确实解决了问题。尽管我宁愿不必为ec2实例付费。好的解决方案!

#1 楼

这是关于这个问题以及这个crypto.SE问题的有趣的讨论(它们似乎被称为“时间锁难题”)。

最可靠的方案是使用受信任的第三方它提供了一个公共密钥,并且仅在一段时间后释放了私有密钥。

唯一不需要可信第三方的方案是迭代哈希一个随机值,用于您想要的时间段,使用结果加密信息,然后丢弃结果并存储初始随机值。为了解密数据,需要再次执行迭代哈希,以恢复用于加密数据的结果,这应该花费与之前相同的时间(尽管可以使用GPU或ASIC加速哈希)。

评论


$ \ begingroup $
我认为第3方是必经之路。我可以让联盟中的另一个成员生成一个公钥,然后再返回以私钥进行解锁。这是使我无法获取信息的唯一对我有意义的方法。谢谢。
$ \ endgroup $
– dan
2012年5月1日22:46

$ \ begingroup $
如果您没有专用的硬件并且希望在精确的时间点解锁代码,则使用迭代哈希是一种非常钝的工具。如果服务器具有四个内核并且必须解锁100个代码,则整个过程将比解锁单个代码花费至少25倍的时间。但是,如果要保证服务器不会提前查看内容,则无法考虑。结果:如果第一个客户提前一个星期下标,那么要到拍卖结束六个月后才能得出结果。
$ \ endgroup $
–亨里克·赫尔斯特伦
2012年5月2日在6:32



$ \ begingroup $
@mgorven:RSA难题肯定看起来像是一种不同(且更好)的方案,不需要受信任的第三方。
$ \ endgroup $
–user991
2012年5月2日在7:17

$ \ begingroup $
只是对将来的说明:实际上,可以使用散列以不对称的工作因数来加密数据-加密只需要很少的时间,而解密所需的时间却很长。我有在我的github上做的代码。
$ \ endgroup $
–艾拉·罗斯(Ella Rose)
16-8-8的1:20



#2 楼

我认为,您的想法是通过发布投标的哈希值来使投标者对投标作出承诺是一个很好的起点。1但是,正如您所注意到的,投标人可以通过拒绝在投标结束时透露投标来有效地撤回投标。拍卖。解决此问题的方法有很多:



只接受它,让投标者撤回投标。如果在拍卖过程中被拍卖资源的价值发生变化,这可能会减少您的利润,但也可能使竞标者更快乐,并且可能会降低保守的竞标价格。

(但是,要进行这项工作,您实际上应该确保每个竞标者在任何时候都只能有一个长期竞标,否则您实际上会将盲目拍卖变成了在披露阶段进行的公开拍卖。)

对拒绝这样做的行为处以罚款显示出价。例如,您可以强加一条规则,即任何无法或不愿透露其出价的人必须支付等于中标价($ x $倍)的款项,但得不到任何回报。这并不能完全消除取消极高出价的动机,但确实有很大的劝阻。

好,您说过您想要一种加密解决方案。只要参与者能够在彼此之间安全地通信,这是可行的:让每个参与者使用Shamir的秘密共享(或任何其他$ n $$ n $秘密共享方案)将其出价分成股份并向所有$ n $参与者分配一股。投标结束后,任何一组$ k $的参与者都可以集中他们收到的股份,从而公开投标。 (Shamir方案的一个不错的功能是只需要预先确定阈值大小$ k $;随着更多参与者的加入,很容易产生更多份额。)

如果您不想让一群$ k $的串通投标人在决定结束竞标之前能够透露出价,则可以让投标人生成一个随机数(在您使用Shamir的字段中算法),然后将其发送给您,然后与他们共享对该随机数的出价XOR(反之亦然;这没有什么区别)。这本质上是一个两级秘密共享方案,在$ k $超出$ n $方案(Shamir's)的基础上覆盖了一个简单的2选2方案(XOR)。

我还建议将此解决方案与基于哈希的承诺方案结合起来,以便投标人既可以投​​标也可以共享。这可以防止其他参与者尝试通过更改其份额来更改其他人的出价,也可以防止出价方通过发布不一致的份额来尝试更改其自己的出价。 (只要有足够多的参与者是诚实的,Shamir的方案的确允许对这些技巧进行一些有限的检测,但是将其与承诺方案结合起来可以使其更加容易和可靠。)它还可以使每个投标人至少可以验证地透露自己的出价,即使$ k $参与者所需的法定人数未能出现并集中他们的股份。


1请注意,仅对出价金额进行散列并不是一个好的承诺方案-一个攻击者仅可以计算所有可能金额的哈希值,然后查看哪一个与出价匹配。更好的解决方案是对包含出价金额,出价者ID和较大随机数(例如128位)的字符串进行哈希处理;对于基于秘密共享的解决方案,此字符串也应该是共享秘密。另外,请勿使用MD5,而应使用SHA-256之类的更安全的工具。

#3 楼

否。计算机可以随时随地想象它。在任何特定时间都没有内在的。您可能使用了非常弱的加密,因此破解需要2天,然后有意丢失私钥,但是您不能保证它需要2天(在这种情况下可能更少或更长时间),并且是一个非常不可靠的解决方案。

#4 楼

我仅看到一种解决您问题的方法(难看),甚至还不是很用户友好:


出价人设置出价,然后使用客户端功能( javascript或您所用的某种东西)(通过对称方式,使用用户选择的一次性密钥)对其出价要约进行加密,然后将其发布到您的页面上(公开可见,因此每个人都可以看到加密的消息,并验证它是否已及时发布) 。
投标时间结束后,所有投标者都提供了密钥,每个人都可以解密其消息并查看报价。
由于每个人都看到加密的报价,因此他们知道它们是按时发布的,只有投标者知道投标的金额,因为只有他才有密钥,并且在投标时间结束后,每个人都可以使用密钥来验证出价。

我说过,这是一个丑陋的解决方案,我只看过一次,作为概念证明,它有很多问题(如果有些投标人不提供密钥,会被丢弃,等等会发生什么情况) 。

还有一个冲突问题(相同的密码文本,不同的出价值,取决于密钥,但这是极不可能的)。

#5 楼

您可以使用ssss之类的东西。它允许您为单个数据生成任意数量的密钥,并允许您指定解密数据需要多少个密钥。这称为秘密共享。这样,您就无法自己解密它,但是它也不需要任何特定的人遵守。

在您的情况下,生成尽可能多的密钥对我来说很有意义人,并需要大量的人来解密数据。这具有用户可能合谋解密数据的缺点。如果可以要求其中之一必须是服务器的密钥,那将很酷,但是我认为ssss中不存在该功能。 (它可能在其他实现中。)在使用ssss重新加密数据之前,您可以先对数据使用廉价的对称加密,以伪造此内容。

评论


$ \ begingroup $
可以(实际上很容易)使用多级秘密共享来创建一个特殊共享,而该共享通常是恢复秘密所需的。请参阅我的答案以获取更多详细信息。
$ \ endgroup $
–伊尔马里·卡洛宁(Ilmari Karonen)
2012年5月2日,12:11

#6 楼

没办法。我唯一能想到的就是将密钥存储在闪存驱动器中,并将该闪存驱动器存储在有时间锁定的保险箱中。例如,生成一个公钥/私钥对。使用私钥对结果进行加密时,将私钥存储在闪存驱动器上并放入时间锁。

评论


$ \ begingroup $
您可能想扩大这个答案。我怀疑您正在建议某种PKI设置,其中投标提交将包括针对公钥进行加密,然后将消息存储起来以供以后由不可用的私钥检索?
$ \ endgroup $
– Zoredache
2012年5月1日22:39