私は、JavaでRSA公開鍵暗号アルゴリズムを実装しています。 2つのランダムな素数を生成する必要があります。私は2048ビットのキーを作成するために2つの1024ビット数を生成するためにSecureRandomクラスを使用しています。私はBigIntegerクラスを使って数値を扱います。私はisProbablePrime()関数を使って、それがプライムかどうかを100の確度で判断します。しかし、定義上、素数が負ではない場合でも、この関数が真の値を返すことに気付きました。なぜJavaでBigInteger.isProbablePrime()関数が負の数に対してtrueを返すのですか?
答えて
「なぜ」の質問に明確な回答を与えることはできません。そのためには、APIを設計した人と話をする必要があります。
私は@ westonの「それは問題ではない」との考えに同意する傾向があります。このlinkを参照してください。また、リンクからの別の持ち帰りは、に従うということです。素数が負であるかどうかは素数の定義が使用されています。 (もっとも広く使用されている定義ではありませんが...)
実装の動作はであることを熟考しています。このメソッドの実装は次のとおりです。
public boolean isProbablePrime(int certainty) {
if (certainty <= 0)
return true;
BigInteger w = this.abs();
if (w.equals(TWO))
return true;
if (!w.testBit(0) || w.equals(ONE))
return false;
return w.primeToCertainty(certainty, null);
}
テストする前に候補の絶対値がどのようになるか注意してください。
この動作は(私が見ることができる)長い時間の間行われています。ZEROはJavaバグレポートを記録しました。これは@ westonの推測をサポートします。
かかわらずisProbablePrime
の行動が正しいかどうかの、実用的な解決策は、あなたの候補者がそれをテストする前に負であるかどうかを確認するためにテストを追加することです。
"...あなたの候補がテスト前に否定的であるかどうかを確認するためのテストを追加する"、またはネガを生成しない。ランダムビットを整数にして符号付きまたは符号なしとして扱うときに選択するので、 – weston
については、not matterを指摘しました。しかし、の内容はで、1024個のランダムビットを整数に変換するときは、どちらが正しい方法であるかを考慮する必要があります。それを署名付き(あなたのように)として扱うか、それを署名なしとして扱いますか?
例えば8ビットで、11010011
をランダムに生成すると、211
が素数である符号なし整数として扱われます。
符号付き整数として同じビット11010011
を扱うと、負の素数を受け入れる場合でも、素数ではない-45
が得られます。
これを間違って入力してください。コードが誤って有効なキーを除外し、無効なキーを誤って受け入れることになります。そして、すべてのネガティブを除外して安全な側に置くと、1023ビットの素数しか得られません(2の補数のネガティブは常に最上位ビットに1を持ちます)。
ビットから整数への変換を扱う方法では、ネガティブな素数の問題を避けることができ、RSAはキーとして選択された数を正しく解釈することができます。私のはと解釈され、その解釈は符号なしです。
私が抱えている問題は、RSAの特定の部分では、署名されたときに負の値をとるため、実際の素数が真であるとテストされた数は生成されていないということです。これは、モジュラスが2つのランダムな素数のLCMであり、それぞれが1を引いた、モジュラ乗法逆行列を求めることを含む。 BigIntegerにはこのための組み込み関数があります。モジュラスが負の値の場合、これは機能しません。 – metroidsocrates
あなたは陽性の可能性のある素数を見つけたと言っていますか? – weston
はい。 BigIntegerクラスは、すべての数値を2の補数表記で表現されているものとして扱います。 BigIntegerクラス以外では、JavaでRSAを実装する実際的な方法はありません。 – metroidsocrates
- 1. なぜC++のclock()関数が負の値を返すのですか?
- 2. AnonymousUserがDjangoのis_authenticatedに対してTrueを返すのはなぜですか?
- 3. 正の数を追加するときに関数が負の数を返すのはなぜですか?
- 4. isVector関数がtrueを返さないのはなぜですか?
- 5. 正規表現/d/.test()がtrueを返すのはなぜですか?引数なしのテスト関数
- 6. 関数が負の数を生成するのはなぜですか?
- 7. 関数を使用して関数を返すのはなぜですか?
- 8. なぜ次のjavascript関数は常にtrueを返しますか?
- 9. 組み込みのall()関数が負の数のリストでTrueを返さない
- 10. なぜJavaScript関数が常に値を返すのですか?
- 11. std :: sortの比較関数が常にtrueを返すと、ランタイムエラーが発生するのはなぜですか?
- 12. Java KeepAliveチェックプログラムが.checkErrorに対してtrueを返さない
- 13. なぜApplication.get_Caller(Type.Missing)は負の整数を返しますか?
- 14. Java 8に「myArray.stream()」関数がないのはなぜですか?
- 15. 文字列が渡されたときに関数がtrueを返すのはなぜですか?
- 16. MDX SUM関数がtrueを返す
- 17. なぜjQuery関数がnullを返すのですか?
- 18. なぜ関数がブール値を返すのですか?
- 19. 関数がNULLを返すのはなぜですか?
- 20. (null + "")。equals( "null")がJavaでtrueを返すのはなぜですか?
- 21. Javascript文字の場合はtrueを返す関数ですか?
- 22. このJava関数がクラッシュするのはなぜですか?
- 23. なぜこのJavascript RegExpがtrueを返すのですか?
- 24. このPython-2.7テストケースがなぜTrueを返すのですか?
- 25. エラーが発生してもストアドプロシージャがtrueを返すのはなぜですか?
- 26. Rでは、length()関数とnrow()関数がSurvオブジェクトで異なる値を返すのはなぜですか?
- 27. 入力に関係なくtrueを返す関数
- 28. なぜ私の関数が返っていないのですか?
- 29. File.Existsが存在しないファイルに対してtrueを返す
- 30. なぜfillapplyがfill = NAではるかに遅く、関数が複数の値を返すのですか?
あなたは乱数生成器を使用していますが、ちょうど1024ビットのプライムを打つことを望んでいますか?あなたはこれを見てください:http://crypto.stackexchange.com/questions/71/how-can-i-generate-large-prime-numbers-for-rsa – weston
おそらくそれは問題ではないからです:https:// primes.utm.edu/notes/faq/negative_primes。html – weston
おそらく、**は**正しいアプローチで暗号リンクを読んでいますが、私には長時間のように聞こえるかもしれません! – weston