2012-06-21 37 views
3

我正在做一個祕密共享算法加密一條消息。要做到這一點,我需要比消息素數更大的消息和一些與消息大小基本相同的隨機數。安全的隨機數的大小給定的大小

我可以用BigInteger.probablePrime(MsgSize + 8)做第一個,但我不知道如何做到以後。

我正在使用Random和更高版本的SecureRandom,但它們不會生成給定長度的數字。我的解決方案是對BigInteger執行randomInt^randomInt,但顯然是一個不好的解決方案。

有些想法?

+1

我不是很確定你想達到什麼,但不會構造函數BigInteger bi = new BigInteger(MsgSize,new SecureRandom());'做竅門? – millimoose

+0

我沒有想過構造函數。但唯一看起來合適的是新的BigInteger(bitLength,確定性,新的SecureRandom),我看到的唯一問題是我不需要檢查它是否爲素數的開銷。 –

+0

@millimoose Your's是我用過的答案,但我查了Sinan Cepel的,因爲我只用了一個推薦。非常好,雖然;) –

回答

2

您是否嘗試過使用較小尺寸的相同probablePrime方法,然後使用大的隨機整數作爲該數字的偏移量?這可能會訣竅,只是一個想法。

+0

我想這也是一個很好的選擇,即使沒有抵消。正如我在上面所說,我看到的唯一問題是我不需要檢查它是否爲素數的開銷。 –

4

您正在實施Shamir's Secret Sharing嗎?如果是這樣,請注意,實際上並不需要比整個消息更大的素數—將消息分解爲一些可管理大小的塊並使用固定素數單獨共享每個塊是完全正確的。另外,沙米爾的祕密共享不需要素數大小的字段;而Shamir的祕密共享並不需要素數大小的字段;而Shamir的祕密共享不需要素數大小的字段。可以使用任何finite field GF(p n),特別包括二進制字段GF(2 n)。這些字段對於計算機實現特別方便,因爲祕密和共享塊將僅僅是n比特的比特串。

唯一複雜的是,在非素數域中,你必須實現finite field arithmetic(或者找到一個現有的實現),並且你需要選擇一個特定的減少多項式並且同意它。然而,前者並不像看起來那麼複雜,後者實際上並不比選擇和同意素數更困難。 (尤其是,GF的還原多項式(2 n)可以自然地表示爲n位位串,從而丟棄始終爲1的高位。)

+0

確實是我試圖做的SSS。感謝您的回答。我使用了一個主要大小的領域,因爲我說這是更安全。事實上,我把這個祕密分成了大塊,然後我尋找比這個塊更大的素數,所以它會比任何塊大。這可能有些奇怪,但這是一個教育演示,所以很高興看到素數隨着塊大小的增長而增長。 –

+1

假設所使用的隨機數是真正的隨機數,獨立性和一致性,假設在有限域中的SSS是信息理論上的安全的,這是一個有趣的說法(關於更安全的素數場)。如果有的話,生成統一的隨機數模2的冪在計算機上比在模數上更容易。 –

+0

我從一門關於安全性的課題上了解到,老師曾經把素數當作最安全的。事實上,我在其他使用open_ssl生成的安全素數的其他算法中使用了我的算法。我暗示你知道,但爲了澄清一個安全的引物編號是引物編號2n + 1,其中n也是素數(我認爲它也被稱爲強素數)。 –

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更改爲長;-)

不知道如果這是件好事,但對我的作品

+0

對我來說這似乎有點低效。最後,我使用了SecureRandom而不是Random,並使用BigInteger的probablePrime(numDigits,準確性)在合理的快速時間內獲得一些近似numDigits數字。 –