3

メッセージを暗号化する秘密共有アルゴリズムを実行しています。そのためには、メッセージの素数よりも大きく、メッセージとほぼ同じサイズの乱数が必要です。

最初はBigInteger.probablePrime(MsgSize + 8)で実行できますが、後で実行する方法がわかりません。

Random以降のSecureRandomを使用していましたが、指定された長さの数値が生成されません。私の解決策は、randomInt ^ randomIntをBigIntegerに対して実行することでしたが、明らかに悪い解決策です。

いくつかのアイデア?

4

3 に答える 3

4

あなたが実装しているのはシャミアの秘密の共有ですか?その場合、実際にはメッセージ全体よりも大きいプライムは必要ないことに注意してください。メッセージを管理可能なサイズのチャンクに分割し、固定プライムを使用して各チャンクを個別に共有することはまったく問題ありません。

また、シャミアの秘密共有はプライムサイズのフィールドを必要としません。特にバイナリ体GF(2 n )を含む任意の有限体GF(p n )を使用することが可能です。シークレットチャンクと共有チャンクの両方が単純にnビットのビット文字列になるため、このようなフィールドはコンピュータの実装に特に便利です。

唯一の複雑な点は、非素体フィールドでは、有限体演算を実装する(または既存の実装を見つける)必要があり、特定の縮小多項式を選択してそれに同意する必要があることです。ただし、前者は見た目ほど複雑ではなく、後者はプライムを選択して同意するよりも実際には難しいことではありません。(特に、GF(2 n)の縮小多項式は、自然にnビットビット文字列として表すことができ、常に1である上位ビットを削除します。)

于 2012-06-21T21:38:12.743 に答える
2

同じprobablePrimeメソッドを小さいサイズで使用してから、その数値からのオフセットとして大きなランダムな整数を使用してみましたか?それはトリックをするかもしれません、ただの考えです。

于 2012-06-21T19:11:22.923 に答える
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に変更するだけです;-)

それが良いかどうかわからないが、私のために働く

于 2012-07-15T21:21:26.503 に答える