最近比较流行论坛抽奖
但由于种种因素,中奖楼层会提前被部分人得知(被C了 or 能被计算),抽奖就演变成了抢楼…
为了方便起见,我们把发起抽奖的人称为主办方,抽奖的人称为水友
那么如何避免抢楼的情况呢?不能让水友提前得知中奖楼层(至少无法轻易计算得知)。
需要做到对于水友来说中奖楼层事先无法预测和事后公开可查,通俗来讲就是 计算和验证非对称,基于这一点,可以衍生两种思路:
- 非对称加密
- 工作量证明
基于环保和低碳的理念,我们选择第一种思路,下面使用rsa举个栗子:
- 主办方生成两个大素数
- 确定中奖楼层算法(例如:较小的素数 mod 500)
- 抽奖时公布算法和两个素数的乘积
- 抽奖截至后需要公布较小的素数,方便水友验算
由于大数分解的不对称性,在主办方公布素数前,水友很难得到这两个素数,自然无法计算中奖楼层;在主办方公布素数后,水友很容易验证中奖楼层的正确性。
这里还有一个问题,主办方其实是知道中奖楼层的,上述过程无法防止和主办方进行py交易得到中奖楼层,那么怎么办呢?让水友参与算法,下面是优化后的过程:
- 主办方生成两个大素数
- 确定中奖结束的时间
- 确定中奖楼层算法(例如:较小的素数 mod 有效时间内的总楼层)
- 抽奖时公布算法和两个素数的乘积
- 抽奖截至后需要公布较小的素数,方便水友验算
这样也能够解决中奖楼层范围公布导致烂尾楼的问题(鼓励回复)
最后贴个码:
from crypto_plus import CryptoPlus
def generate(bits=4096):
rsa = CryptoPlus.generate_rsa(bits)
p = rsa.private_key.p
q = rsa.private_key.q
n = rsa.private_key.n
m_min = min(p, q)
return n, m_min
if __name__ == '__main__':
print(generate())
来个免费的赞呐