编辑:现在是http://messymatters.com/sealedbids的主要运动博客
rot13的思想是模糊文本,例如,为了防止破坏者。它并不意味着密码安全,而只是确保只有那些确信想要阅读它的人才会阅读它。
我想做一些类似的数字,一个应用程序涉及密封出价。粗略地说,我想把我的号码寄给别人,并相信他们会选择自己的号码,不受我的影响,但当他们准备好的时候,他们应该能够透露我的号码(纯粹的客户端)。他们不应要求我或任何第三方提供进一步的投入。
(补充:请注意收件人被信任而不是欺骗的假设。)
这并不像rot13那么简单,因为某些数字,比如1和2,会经常出现,因此您可能会记住,比如说,34.2实际上是1。
我特别想找的是:
函数密封(),它将实数映射为实数(或字符串)。它不应该是确定性的--印章(7)不应该每次都映射到相同的东西上。但是相应的函数解封()应该是确定性的--解封(密封( x ))对所有x都应该等于x。我不希望海豹或解密调用任何get服务,甚至不想获得系统时间(因为我不想假设同步时钟)。(补充说:假设所有出价都将低于某个最大值,这是很好的,每个人都知道,比如一百万。)
健全检查:
> seal(7)
482.2382 # some random-seeming number or string.
> seal(7)
71.9217 # a completely different random-seeming number or string.
> unseal(seal(7))
7 # we always recover the original number by unsealing.发布于 2009-05-01 15:23:46
这里有一个由Svante的答案启发的解决方案。
M = 9999 # Upper bound on bid.
seal(x) = M * randInt(9,99) + x
unseal(x) = x % M健全检查:
> seal(7)
716017
> seal(7)
518497
> unseal(seal(7))
7但这需要调整,以允许负面出价:
M = 9999 # Numbers between -M/2 and M/2 can be sealed.
seal(x) = M * randInt(9,99) + x
unseal(x) =
m = x % M;
if m > M/2 return m - M else return m这个解决方案的一个好处是,对于接收者来说,解码是多么的琐碎--只需在9999之前解码(如果是5000或更多,那么这是一个负面的出价,因此减去另一个9999)。这也是很好的,模糊的出价将在最多6位数长。(这对我的想法来说是足够的安全-如果出价可能超过5000美元,我会使用更安全的方法。当然,这个方法中的最大出价可以设置为任意高。)
Lay Folk的说明
选择一个数字之间的9和99,并乘以9999,然后添加你的出价。这将产生一个5或6位数字,编码你的出价。要解开它,除以9999,将部分减去小数点的左边,然后乘以9999。(对于儿童和数学家来说,这被称为“当除以9999”或“mod‘’ing被9999”时,分别找到剩余的部分)。
这适用于低于9999的非负面出价(如果这还不够,可以使用99999位或任意数量的数字)。如果你想让负面出价,那么神奇的9999数字需要是两倍的最大可能的出价。当解码时,如果结果大于9999的一半,即5000或更多,则减去9999以得到实际(负)出价。
再次,请注意,这是在荣誉系统:没有什么技术上阻止你打开别人的号码,一旦你看到它。
发布于 2009-04-30 21:57:04
您可以将数字与另一个随机浮点数一起打包为4字节浮点数,并将其发送给双字节浮点数。然后,客户机只需获取前四个字节即可。在python中:
import struct, random
def seal(f):
return struct.unpack("d",struct.pack("ff", f, random.random() ))[0]
def unseal(f):
return struct.unpack("ff",struct.pack("d", f))[0]
>>> unseal( seal( 3))
3.0
>>> seal(3)
4.4533985422978706e-009
>>> seal(3)
9.0767582382536571e-010发布于 2009-04-30 21:24:53
你想做的事情(一个承诺方案)是不可能只做客户端的.你能做的最好的就是用共享密钥加密。
如果客户不需要您的合作来透露号码,他们就可以修改程序来显示号码。你最好只是把它寄出去,而不是显示出来。
要正确地做到这一点,您可以发送您的出价的安全散列+随机盐。这就让你答应了你的出价。另一个客户可以以同样的方式承诺他们的出价。然后你们每个人分享你的出价和盐。
因为您信任另一个客户端,所以编辑:
Sender:
Let M be your message
K = random 4-byte key
C1 = M xor hash(K) //hash optional: hides patterns in M xor K
//(you can repeat or truncate hash(K) as necessary to cover the message)
//(could also xor with output of a PRNG instead)
C2 = K append M //they need to know K to reveal the message
send C2 //(convert bytes to hex representation if needed)
Receiver:
receive C2
K = C2[:4]
C1 = C2[4:]
M = C1 xor hash(K)https://stackoverflow.com/questions/809137
复制相似问题