Java で RSA 公開鍵暗号アルゴリズムを実装しています。2 つのランダムな素数を生成する必要があります。私は SecureRandom クラスを使用して 2 つの 1024 ビットの数値を生成し、2048 ビットのキーを作成しました。BigInteger クラスを使用して数値を処理します。isProbablePrime() 関数を使用して、それが素数であるかどうかを 100 の確実性で判断します。ただし、この関数は負の数に対して true を返していることに気付きました。定義上、素数は負の値にはなりません。
user7187118
質問する
630 次
2 に答える
2
素数については、問題ないかもしれないと指摘しました。しかし、重要なのは、1024 のランダム ビットを整数に変換するときに、どちらが正しいアプローチであるかを検討する必要があるということです。署名されているものとして扱うか (あなたのように)、署名されていないものとして扱いますか?
したがって、たとえば8ビットで、ランダムに生成する11010011
と211
、素数である符号なし整数として扱われます。
同じビット11010011
を符号付き整数として扱うと-45
、負の素数を受け入れたとしても、どれが素数ではないかがわかります。
これを間違えると、コードは有効なキーを誤って除外し、無効なキーを誤って受け入れます。安全のためにすべての負を除外すると、1023 ビットの素数しか得られません (2 の補数の負は常に最上位ビットに 1 があります)。
したがって、ビットから整数への変換を処理する方法は、負を回避し、負の素数の問題全体を回避することができ、RSA はキーとして選択された数値の正しい解釈を 1 つだけ持つことになります。私の推測では、解釈は署名されていません。
于 2017-01-08T14:51:04.673 に答える