提问人:Freddie 提问时间:8/4/2023 最后编辑:Sam MasonFreddie 更新时间:8/5/2023 访问量:102
如何生成周期性的、不可预测的、可验证的随机数?
How to generate a periodic, unpredictable, verifiable random number?
问:
我想要一个具有以下品质的程序的随机数:
周期性:随机数需要在某个时间窗口内是随机的。最好每小时一次,但可以更多。一旦周期结束,就可以生成下一个随机数,并且可以根据公开可用的种子值重新生成先前生成的值。
不可预测:下一个随机数不容易确定。公开可用的种子不得公开。
可验证:随机数的种子应来自某些公开可用的来源。也许科学研究组织或政府机构正在发布每日或每小时的数字。例如,记录的一组温度。或者,例如,它可以像发布每小时或每天随机数的网站一样简单。
种子应至少为 64 位整数。如果它太小,那么可以从一个小集合中猜测随机数。
不需要工业强度或严格的随机性。对极端、高精度的随机性不感兴趣。
我看到 https://avkg.com/ 生成了大量的每日随机数,这实际上非常接近,如果没有其他看起来更好的,我可能会使用它。特别是因为它存档了过去的结果,因此满足了可验证的要求。问题是该网站没有一个干净且有据可查的 API,而且它不是每小时一次。此信息的 HTML 抓取并不理想。
我的另一个想法是使用特定人群的最新推文(X)的哈希值。做这样的事情可以进行验证。问题是我不知道他们是每天还是每小时发推文。此外,Elon 现在已将 Twitter (X) 设置为非公开,因此您需要登录才能收集此信息。
另一个想法是创建一个我自己的AVKG版本。
当然,日期是行不通的,因为这不能满足上述不可预测的要求。
有什么想法吗?
非常感谢。
答:
鉴于您所写的内容,我想我只会在计数器模式下使用对称密码(例如 ChaCha20)来生成请求的数据,并使用 KDF(例如 Argon2)在密钥之间转换。
您的私有状态将是:
key
此期间使用的私钥salt
用于过渡到此键的盐
您的公共状态为:
ctr
当前计数器值log
以前使用的私钥和盐
当有人提出请求时,你会以原子的方式:
- 使用 和 生成新的随机数据块,
key
ctr
data
- 响应 , ,
i = len(log)
ctr
data
- 增加
ctr
当您进入下一个时期时,您将以原子方式:
- 追加 和
key
salt
log
- 重置为零
ctr
- 生成 16 个随机字节
salt
- 使用 KDF 生成一个新的,将其与上一周期的
key
salt
key
当用户想要验证他们的 时,他们会:data
- 请求公共状态
- 验证密钥是否来自并生成其
log[i]
ctr
data
如果用户想要验证其是否安全生成,他们将:key
- 请求公共状态
- 验证将 from 与 in 组合在一起是否会生成 in
key
log[i-1]
salt
log[i]
key
log[i]
用户可以匿名(例如,来自多个不相关的主机)请求公共状态来验证:
- 这些不会意外改变
- 在执行数据请求时,这些数据是一致的
评论
data
评论