我正在做一个加密 aa 消息的秘密共享算法。为此,我需要一个大于消息的素数和一些与消息大小大致相同的随机数。
我可以用 BigInteger.probablePrime(MsgSize+8) 做第一个,但我不知道后面怎么做。
我使用的是 Random 和后来的 SecureRandom 但它们不会生成给定长度的数字。我的解决方案是对 BigInteger 执行 randomInt ^ randomInt 但显然是一个糟糕的解决方案。
一些想法?
我正在做一个加密 aa 消息的秘密共享算法。为此,我需要一个大于消息的素数和一些与消息大小大致相同的随机数。
我可以用 BigInteger.probablePrime(MsgSize+8) 做第一个,但我不知道后面怎么做。
我使用的是 Random 和后来的 SecureRandom 但它们不会生成给定长度的数字。我的解决方案是对 BigInteger 执行 randomInt ^ randomInt 但显然是一个糟糕的解决方案。
一些想法?
您正在实施的是Shamir 的秘密分享吗?如果是这样,请注意您实际上并不需要比整个消息更大的素数 - 将消息分成一些可管理大小的块并使用固定的素数单独共享每个块是非常好的。
此外,Shamir 的秘密共享不需要素数大小的字段;可以使用任何有限域GF(p n ),尤其包括二进制域 GF(2 n )。这样的字段对于计算机实现特别方便,因为秘密和共享块都将是简单的 n 位比特串。
唯一的复杂性是,在非质数域中,您必须实现有限域算术(或找到现有的实现),并且您需要选择一个特定的约简多项式并同意它。然而,前者并不像看起来那么复杂,而后者并不比选择和同意素数更难。(特别是,GF(2 n ) 的约简多项式可以自然地表示为 n 位位串,丢弃始终为 1 的高位。)
您是否尝试过使用较小尺寸的相同 probablePrime 方法,然后使用较大的随机整数作为该数字的偏移量?这可能会奏效,只是一个想法。
我有同样的问题(这就是我找到这篇文章的原因)。有点晚了,但也许其他人发现这种方法很有用:
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 ;-)
不知道好不好,但对我有用