Метод Коблица в Java

Я пытаюсь использовать метод Коблица для преобразования String в ECPoint, Eclipse говорит, что в моем коде нет ошибок, но когда я пытаюсь запустить свое приложение, он получает ошибку каждый раз, когда код попадает в метод Коблица.

Извините, я знаю, что такой пост не является образовательным, но я не могу найти проблему в своем исходном коде.

public static ECPoint ConvertToPoint(String S){
    BigInteger neg = new BigInteger("-1");
    BigInteger one = BigInteger.ONE;
    BigInteger adder = BigInteger.ONE;
    BigInteger two = new BigInteger("2");
    BigInteger M,MK,Y,s = null, n = BigInteger.ONE,x,x2,x3 = null,B,B2,B3,g,g2,g3;
    BigInteger X = null;
    BigInteger k = new BigInteger("20");
    BigInteger P  = new BigInteger("751"); //Prime number (P)
    BigInteger a  = new BigInteger("-1"); //Curve Parameter a
    BigInteger b  = new BigInteger("188"); //Curve Parameter b
    int e = 1;
    int m = 0;
    int r;

    if (S=="B"){
        M = new BigInteger("11");
        MK = M.multiply(k);
        X = MK.add(adder); // x = m.k + i
        Y = (X.multiply(X).multiply(X)).add(a.multiply(X)).add(b); // y = (x^3 + ax + b)

        BigInteger C = (P.subtract(one)).divide(two);

        while((Y.mod(one) != BigInteger.ZERO) && (P.gcd(Y) != one) && Y.modPow(C, P) != one){
            adder = adder.add(one);
            X = MK.add(adder);   
            Y = (X.multiply(X).multiply(X)).add(a.multiply(X)).add(b);
        }   
        s = (P.subtract(one)).divide(two.pow(e));
        while (s.mod(two)== BigInteger.ZERO){
            e = e+1;
            s = (P.subtract(one)).divide(two.pow(e));
        }
        while (((n.modPow(C, P)) != neg.mod(P)) || (sqrt(n).mod(one)== BigInteger.ZERO)){
            n = n.add(one);
        }
        x = Y.modPow((s.add(one).divide(two)), P);
        B = Y.modPow(s, P);
        g = n.modPow(s, P);
        r = e;

        while (B.modPow(two.pow(m), P) != BigInteger.ONE){
            m = m+1;
        }
        if (m>0){
            x2 = x.multiply(g.pow(2^(r-m-1)));
            x3 = x2.mod(P);
            B2 = B.multiply(g.pow(2^(r-m)));
            B3 = B2.mod(P);
            g2 = g.pow(2^(r-m));
            g3 = g.mod(P);
            r = m;
        }
        else if (m==0){
            x3 = x;
            B3 = B;
            g3 = g;
            r = e;
        }
    }
       //This is when the program crashes
   ECPoint T = new ECPoint(X,x3); 
   return T;

person RedCrimson    schedule 27.04.2014    source источник
comment
Если вы задаете вопрос об ошибке или исключении, которое вы видите, вы можете опубликовать сообщение со своим вопросом и указать для нас, какая строка вызывает его.   -  person Hovercraft Full Of Eels    schedule 27.04.2014
comment
Также никогда не делайте этого: if (S=="B"). Вместо этого используйте метод String equals для сравнения строк, if ("B".equals(S)). Поймите, что == проверяет, являются ли два объекта одинаковыми, что вас не интересует. Методы equals и equalsIgnoreCase, с другой стороны, проверяют, имеют ли две строки одинаковые символы в тот же порядок, и это то, что имеет значение здесь.   -  person Hovercraft Full Of Eels    schedule 27.04.2014
comment
@HovercraftFullOfEels: я попробовал ваше предложение и только что отладил программу. Я обнаружил, что проблема, похоже, в первом: while((Y.mod(one) != BigInteger.ZERO) && (P.gcd(Y) != one) && Y.modPow(C, P) != one) Правильно ли там мой код? Logcat говорит следующее: FATAL EXCEPTION: main и java.lang.NullPointerException: affineX == null и многое другое, но первые 2 строки ошибок - это те   -  person RedCrimson    schedule 27.04.2014
comment
Хорошо, я увидел это при втором взгляде, спасибо, но опять же, какое сообщение об ошибке или трассировку стека вы видите? Пожалуйста, опубликуйте все сообщение как редактирование вашего вопроса.   -  person Hovercraft Full Of Eels    schedule 27.04.2014


Ответы (1)


Я вижу две проблемы с вашим кодом, хотя я не знаю, вызывает ли это вашу ошибку:

  • Опять же, как указано в моем комментарии, не сравнивайте строки, используя ==. Вместо этого используйте метод equals(...) или equalsIgnoreCase(...). Поймите, что == проверяет, являются ли два объекта одинаковыми, что вас не интересует. С другой стороны, методы проверяют, имеют ли две строки одинаковые символы в одном и том же порядке, и это что здесь важно.
  • То же самое касается BigIntegers. Вы должны либо использовать метод equals(...), либо метод compareTo(...), если вы хотите проверить равенство/неравенство или > или <.
  • Это трюизм, который обычно верен, что все ссылочные типы должны проверяться на равенство с помощью их метода equals(...). Это не так для примитивов, у которых нет методов. Также перечисления можно проверить на равенство через == и !=, хотя equals(...) для них подойдет.

Кроме того, вы захотите изучить и использовать соглашения об именах Java. Имена переменных должны начинаться со строчной буквы, а имена классов — с заглавной. Также вам следует избегать использования тривиальных имен переменных, таких как b или s, если только они не используются для тривиальных целей, таких как индекс цикла for. Вместо этого используйте имена, которые имеют какое-то значение, чтобы ваш код стал самокомментирующим.

Следуя этим советам, а также придерживаясь хороших методов форматирования кода, вы позволите другим (например, нам!) лучше понять ваш код и, что более важно, позволит вам в будущем лучше понять, о чем вы думали 6 месяцев назад, когда писали код. код.

person Hovercraft Full Of Eels    schedule 27.04.2014
comment
Я следовал вашим инструкциям и немного поправил свой код, но теперь я получаю сообщение от logcat: WAIT_FOR_CONCURRENT_GC blocked 94ms и GC_CONCURRENT freed. Я получаю много из тех. Я просмотрел форумы и нашел это. Кажется, я не знаю, где мой исходный код создает gc - person RedCrimson; 28.04.2014
comment
У меня проблемы с первым while. Программа, кажется, зацикливается на первом while и не может выйти. Существует ли конкретная спецификация параметров кривой, которая должна быть соблюдена, чтобы метод Коблица был успешным? - person RedCrimson; 30.04.2014
comment
Какой синтаксис я использую для проверки неравенства? Например, я хочу проверить if (A != B), могу ли я использовать if (!A.equals(B))? Это правда? - person RedCrimson; 02.05.2014