Как сгенерировать очень большой BigInt

Я хочу внедрить RSA, и для этого мне нужно сгенерировать e, который должен быть gcd(e, ø(n)) = 1 and 1 < e < ø(n), а также должен быть очень близок по размеру к ø(n). мой алг. ниже учитываются первые два шага, но сгенерированное число довольно мало. Как я могу создать больший?

    // generate random p,q,r on 512 bits
    p = new BigInteger(512, 15, new Random());
    q = new BigInteger(512, 15, new Random());
    r = new BigInteger(512, 15, new Random());

    // calculate n = p*q*r 
    n = p.multiply(q);
    n = n.multiply(r);

    //calculate ø(n) = (p - 1)*(q - 1)*(r - 1) 
    ø_n = p.subtract(BigInteger.valueOf(1));
    ø_n = ø_n.multiply(q.subtract(BigInteger.ONE));
    ø_n = ø_n.multiply(r.subtract(BigInteger.ONE));

    do {
    e = new BigInteger(2 * 512, new Random());

} while //while e >= ø_n
        ((e.compareTo(ø_n) >= 0)
        || //while gcd(e, ø(n)) != 1
        (e.gcd(ø_n).compareTo(BigInteger.ONE) != 0));

Проверьте цикл while, все остальное — просто инициализация.


person George Irimiciuc    schedule 01.04.2014    source источник
comment
Обратите внимание, вы можете использовать BigInteger.ONE   -  person fge    schedule 01.04.2014
comment
Начните с огромного смещения + рандом. И затем повторять до тех пор, пока не будет общих делителей. Тупой алгоритм, но обходит умные числа, которые все знают, что нужно сначала попробовать.   -  person Joop Eggen    schedule 01.04.2014
comment
Я плохо разбираюсь в RSA, но разве вы не должны выбирать случайные числа из SecureRandom ?   -  person Piotr Müller    schedule 01.04.2014
comment
Почему бы тебе не спуститься с ø_n? Например, взятие e = ø_n - 1 не должно иметь общих делителей с ø_n, и это самый большой из возможных делителей.   -  person Ingo    schedule 01.04.2014
comment
Это неэффективный способ с вычислительной точки зрения. Знание e или как его вычислить облегчает атаку. Я сделаю, как сказал @JoopEggen, кажется хорошей альтернативой.   -  person George Irimiciuc    schedule 01.04.2014
comment
Теперь, если да, то как я могу сгенерировать очень большой p,q,r?   -  person George Irimiciuc    schedule 01.04.2014
comment
@GeorgeIrimiciuc Как насчет умножения двух или трех значений System.nanoTime() и разделения их на случайное число между Integer.MAX_VALUE и Integer.MIN_VALUE.   -  person anu    schedule 01.04.2014


Ответы (1)


Рассмотрите возможность использования BigInteger.probablePrime() с SecureRandom.

person Alexey Malev    schedule 02.04.2014