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