【问题标题】:Secure random number of aproximately given size大约给定大小的安全随机数
【发布时间】:2012-06-21 19:05:33
【问题描述】:

我正在做一个加密消息的秘密共享算法。为此,我需要一个大于消息的素数和一些与消息大小大致相同的随机数。

我可以用 BigInteger.probablePrime(MsgSize+8) 做第一个,但我不知道后面怎么做。

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

一些想法?

【问题讨论】:

  • 我不太确定你想要实现什么,但构造函数 BigInteger bi = new BigInteger(MsgSize, new SecureRandom()); 不会解决问题吗?
  • 我没有想到构造函数。但似乎唯一合适的是 new BigInteger(bitLength, certainty, new SecureRandom),我看到的唯一问题是我不需要检查它是否是素数的开销。
  • @millimoose Your's 是我使用的答案,但我检查了 Sinan Cepel 的答案,因为我只是使用了一个表扬。非常好的一个,不过;)

标签: java random cryptography biginteger


【解决方案1】:

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

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

唯一的复杂之处在于,在非素数字段中,您必须实现 finite field arithmetic(或找到现有的实现),并且您需要选择一个特定的约简多项式并达成一致。然而,前者并不像看起来那么复杂,而后者并不比选择和同意素数更难。 (特别是,GF(2n) 的约简多项式可以自然地表示为 n 位位串,丢弃始终为 1 的高位。)

【讨论】:

  • 确实是我想要做的 SSS。感谢您的回答。我使用了一个主要大小的字段,因为有人说它更安全。事实上,我将秘密分成几块,然后我寻找一个比这个块更大的素数,所以它会比任何块都大。这可能有点奇怪,但这是一个教育演示,所以很高兴看到素数随着块大小的增长而增长。
  • 这是一个有趣的主张(关于素数域更安全),因为 any 有限域中的 SSS 在信息理论上是安全的,前提是使用的随机数是真正随机的,独立且统一。如果有的话,在计算机上生成以 2 的幂为模的均匀随机数往往比以素数为模更容易。
  • 我是在一个关于安全的主题上学习的,老师曾经喜欢素数作为最安全的。事实上,我的算法基于使用 open_ssl 生成的安全素数的其他算法。我想你知道,但为了澄清起见,一个安全的引数是一个引数 2n+1,其中 n 也是素数(我认为它也被称为强素数)。
【解决方案2】:

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

【讨论】:

  • 我想这也是一个不错的选择,即使没有偏移量。正如我在上面所说的,我看到的唯一问题是我不需要检查它是否是素数的开销。
【解决方案3】:

我遇到了同样的问题(这就是我找到这篇文章的原因)。 有点晚了,但也许其他人发现这种方法很有用:

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 x = getBigRandom(y);

每 y 会给你大约 50 位数。

如果您需要超过 (2^31-1)*50 个数字,只需将 int 更改为 long ;-)

不知道好不好,但对我有用

【讨论】:

  • 这对我来说似乎有点低效。最后,我使用 SecureRandom 而不是 Random,并使用 BigInteger 的 probablePrime(numDigits, accuracy) 在相当快的时间内获得一些近似的 numDigits 数字。
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2018-02-27
  • 2020-01-28
相关资源
最近更新 更多