dre*_*ves 12 language-agnostic encryption math function
rot13的想法是模糊文本,例如防止剧透.它并不意味着加密安全,而只是确保只有那些确定要阅读它的人才能阅读它.
对于涉及密封投标的申请,我想对数字做类似的事情.粗略地说,我想向某人发送我的号码并相信他们选择他们自己的号码,不受我的影响,但是当他们准备好时他们应该能够透露我的(纯粹是客户端).他们不应要求我或任何第三方提供进一步的意见.
(已添加:请注意收件人信任不作弊的假设.)
它并不像rot13那么简单,因为某些数字,比如1和2,会经常发生,你可能会记得34.2确实是1.
这是我正在寻找的具体内容:
功能密封(),将实数映射到实数(或字符串).它应该不具有确定性-封口(7)每次不应映射到相同的事情.但相应的函数unseal()应该是确定性的 - unseal(seal(x))应该等于所有x的x.我不希望密封或开封调用任何web服务甚至获得系统时间(因为我不想假设同步时钟).(补充:可以假设所有出价都低于某个最高出价,每个人都知道,比如一百万.)
完整性检查:
> 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.
Run Code Online (Sandbox Code Playgroud)
您可以将您的号码作为一个4字节的浮点数与另一个随机浮点数一起打包成一个double并发送它.然后客户端只需要获取前四个字节.在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
Run Code Online (Sandbox Code Playgroud)
这是一个灵感来自Svante答案的解决方案.
M = 9999 # Upper bound on bid.
seal(x) = M * randInt(9,99) + x
unseal(x) = x % M
Run Code Online (Sandbox Code Playgroud)
完整性检查:
> seal(7)
716017
> seal(7)
518497
> unseal(seal(7))
7
Run Code Online (Sandbox Code Playgroud)
这需要调整以允许负面出价:
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
Run Code Online (Sandbox Code Playgroud)
关于这个解决方案的一个好处是接收者解码是多么微不足道 - 只需修改9999(如果是5000或更多那么它是负投标,所以减去另一个9999).这个模糊的出价最多只能是6位数,这也很好.(对于我的想法,这是非常安全的 - 如果出价可能超过$ 5k,那么我会使用更安全的方法.当然,此方法的最高出价可以设置为您想要的最高值.)
选择介于9到99之间的数字并将其乘以9999,然后添加出价.这将生成一个5位或6位数字,用于对您的出价进行编码.要开封它,除以9999,减去小数点左边的部分,然后乘以9999.(这对儿童和数学家来说是"在除以9999时找到余数"或"以9999换算" , 分别.)
这适用于小于9999的非负投标(如果这还不够,请使用99999或任意数量的数字).如果您想允许否定出价,那么神奇的9999号码需要是最大可能出价的两倍.并且在解码时,如果结果大于9999的一半,即5000或更多,则减去9999以获得实际(负)出价.
再次注意,这是在荣誉系统上:从技术上讲,没有任何东西可以阻止你在看到别人的号码时立即开启.