Java 近似给定大小的安全随机数

Java 近似给定大小的安全随机数,java,random,cryptography,biginteger,Java,Random,Cryptography,Biginteger,我正在做一个秘密共享算法,它对消息进行加密。要做到这一点,我需要一个大于消息的素数和一些与消息大小大致相同的随机数 我可以用biginger.probablePrime(MsgSize+8)做第一个,但我不知道如何做后面的 我使用了Random和后来的SecureRandom,但它们不会生成给定长度的数字。我的解决方案是对BigInteger执行randomInt^randomInt,但这显然是一个糟糕的解决方案 一些想法?您是否尝试过使用相同的probablePrime方法,使用较小的大小,然

我正在做一个秘密共享算法,它对消息进行加密。要做到这一点,我需要一个大于消息的素数和一些与消息大小大致相同的随机数

我可以用biginger.probablePrime(MsgSize+8)做第一个,但我不知道如何做后面的

我使用了Random和后来的SecureRandom,但它们不会生成给定长度的数字。我的解决方案是对BigInteger执行randomInt^randomInt,但这显然是一个糟糕的解决方案


一些想法?

您是否尝试过使用相同的probablePrime方法,使用较小的大小,然后使用较大的随机整数作为该数字的偏移量?这可能会奏效,只是一个想法。

是您正在实施的吗?如果是这样,请注意,您实际上不需要比整个消息更大的素数-将消息分成一些可管理大小的块,并使用固定的素数分别共享每个块是非常好的

此外,Shamir的秘密共享不需要一个素数大小的字段;可以使用任何GF(pn),尤其包括二进制字段GF(2n)。这样的字段对于计算机实现特别方便,因为机密块和共享块都将是简单的n位位位字符串

唯一复杂的是,在非素数字段中,您必须实现(或找到现有的实现),并且需要选择一个特定的约化多项式并达成一致。然而,前者并不像看上去那么复杂,后者也并不比选择和商定一个素数更难。(特别是,GF(2n)的约化多项式可以自然地表示为一个n位的位字符串,去掉始终为1的高位。)

我也有同样的问题(这就是我发现这篇文章的原因)。 虽然有点晚了,但可能其他人会觉得这种方法很有用:

public static BigDecimal getBigRandom(int d)
{
    BigDecimal rnd = new BigDecimal(Math.random());

    BigDecimal rndtmp;

    for(int i=0;i<=d;i++)
    {
        rndtmp = new BigDecimal(Math.random());
        rndtmp = rndtmp.movePointLeft(rnd.precision());
        rnd = rnd.add(rndtmp);
    }    

    return rnd;
}
公共静态BigDecimal getBigRandom(int d)
{
BigDecimal rnd=新的BigDecimal(Math.random());
大十进制rndtmp;

对于(int i=0;我不太确定您想要实现什么,但是构造函数
biginger bi=new biginger(MsgSize,new SecureRandom());
是否会这样做?我没有想到构造函数。但是唯一合适的是new biginger(位长,确定性,new SecureRandom),我看到的唯一问题是,我不需要检查它是否为素数的开销。@millimoose Your的答案是我使用的,但我检查了Sinan Cepel的答案,因为我只使用了一个command。不过很好;)我想这也是一个很好的选择,即使没有偏移量。正如我在上面所说的,我看到的唯一问题是我不需要检查它是否为素数的开销。事实上,SSS是我正在尝试做的。谢谢你的回答。我使用素数大小的字段,因为我说它更安全。事实上,我将秘密分块,然后寻找素数b比这个块大,所以它会比任何块都大。这可能有点奇怪,但这是一个教育演示,所以很高兴看到prime随着块的大小而增长。这是一个有趣的说法(关于prime字段更安全),假设任何有限域中的SSS都是理论上安全的信息,前提是所使用的随机数是真正随机的、独立的和均匀的。如果有什么区别的话,在计算机上生成2次幂的均匀随机数往往比模素数容易。我是在一门关于安全性的课程上学的,老师用to最安全的素数。事实上,我的算法基于另一种算法,它使用开放式ssl生成的安全素数。我相信你知道,但为了澄清,安全素数是一个素数2n+1,其中n也是素数(我认为它也被称为强素数)。对我来说,这似乎有点低效。最后,我使用SecureRandom而不是Random,并使用BigInteger的probablePrime(numDigits,accurity)在相当快的时间内获得了一些近似的numDigits数字。