1

RSAアルゴリズムを使用した単純な暗号化で遊んでいて、奇妙なバグを見つけました。

private static Integer testEnc(Integer value){
    Integer val = (int)Math.pow(value, 37);
    return val % 437; 
}

private static Integer testDec(Integer value){
    Integer val = new Integer((int)Math.pow(value, 289));
    return val % 437;
}

public static void main(String[] args) {
    System.out.print("Encode 55  = ");
    Integer encoded = testEnc(2);
    System.out.println(encoded + "\n");

    System.out.print(encoded + " decoded = ");
    Integer decoded = testDec(3977645);
    System.out.println(decoded + "n");
}

次の関数は両方とも、入力に関係なく97を返します。モジュラスをコメントアウトしてvalを返すだけの場合、戻り値は2147483647です。

doubleからintへの型キャストが問題のようですが、なぜそうなのかわかりません。これらのメソッドは、メインメソッドから呼び出していたためにのみ静的です。

4

2 に答える 2

6

2147483647 は int の最大値、別名 2^31-1 です。>=2 の任意の値に対して、2^37 > 2^31-1 であるため、オーバーフローが発生します。

モジュロ 437 のパワーを取得するには、すべてのステップでモジュロを取得する必要があります。例:

private static int myPow(int a, int b, int mod){
    int ret = 1;
    for(int i = 0; i < b; i++)
    {
        ret = (ret * a) % mod;
    }
    return ret;
}
于 2012-12-10T04:59:39.567 に答える
1

2147483647 は、最大の符号付き 32 ビット整数です。私の推測では、テスト値の 37 乗と 289 乗は、int に格納できる値よりも大きいと思います。long を使用してみて、何が起こるかを確認してください。

于 2012-12-10T04:59:34.117 に答える