可验证的随机数[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可验证的随机数[关闭]相关的知识,希望对你有一定的参考价值。
我需要生成一个10位数的随机数作为交易的参考。该号码必须以某种方式验证,该服务是由该服务生成的。例如,如果有人为永远不会发生任意引用号的事务提交争议,系统应该能够验证该号码是否是由服务生成的(尽管可以向数据库查询给定的号码,但是通过验证给定数字是否符合格式(例如使用校验和/摘要)来区别。我可以想到我在下面描述的一些方法
方法1:添加此随机数的某些部分,其中的值是系统内部的一部分,例如,IP,MAC地址,时间戳,客户和其他人的哈希值。
这减少了由于一些静态/较小动态部分占用数量而导致的随机性。但是,任何知道此模式的人都可以生成一个数字,除非该值不是内部的。
方法2:Mod-97 10将摘要附加到此编号,以便可以验证。但是,我相信,这也可以由任何知道每个随机数附加摘要的人生成。我对吗?
方法3:生成包含作为系统一部分的密钥的摘要。除非有人知道密钥,否则他们无法使用摘要创建随机数。
有没有人以不同的方式解决这个问题?如果你能指出我对这个解决方案的指示,或者给我一个答案,我会很高兴的。
干杯
生成随机数并使用私钥对其进行签名。所以一些数字将是随机数,至少是数字的一半。一些数字将是签名。发布您的公钥和系统,然后任何人都可以验证签名,但只有您可以生成它,因为只有您拥有私钥。搜索PKI(公钥基础结构)。
当然,如果你只设置三个数字用于签名,那么有1000种可能性,对于拥有计算机的人来说,很容易尝试所有1000个并查看哪一个验证。即使有5位数的随机数和5位数的签名,你也很容易受到这种蛮力攻击。
可能更好地签署整个交易,而不仅仅是随机参考号。为了保证安全,您需要数百或数千位来进行签名。
维基百科链接:Public key infrastructure
public static void main(String args[])
{
generateMyNumber();
}
public static void generateMyNumber()
{
Random t = new Random();
Random rand = new Random();
for (int c = 1; c <= 10; c++)
{
long number = rand.nextInt(999999999)* 9999999999L;
System.out.println(number);
}
}
以上是关于可验证的随机数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章