Поскольку вы просили о какой-либо помощи, я отвечу на ваш вопрос и дам другие советы.
Как получить e
Один из советов — использовать equals()
вместо compareTo()
, когда вы просто проверяете равенство. Иногда это может уменьшить объем выполняемой работы, а также его легче читать.
Самая большая ошибка в вашем коде заключается в том, что temp
используется для установки исходного значения GCD
, но это не связывает temp
с НОД. Они остаются отключенными. Если вы измените temp
позже, GCD
не узнает об этом и не изменит. Вам нужно добавить один в GCD
напрямую. Вот пример кода:
BigInteger e = BigInteger.valueOf(3);
while (! phi.gcd(e).equals(BigInteger.ONE)) {
e = e.add(BigInteger.ONE);
}
Просмотрите методы BigInteger
Получите представление о том, что вы можете легко сделать с BigInteger
, используя свою любимую поисковую систему и выполнив поиск BigInteger 8 API
. 8 соответствует версии Java, которую вы используете, так что это может измениться. API предназначен для списка методов.
В начале результатов поиска вы должны найти этот API страница. BigInteger
имеет много хороших и удобных методов, так что проверьте их. У него даже есть конструктор, который даст вам BigInteger
любого размера, который вы хотите, который, скорее всего, будет простым числом, что хорошо для генерации простых чисел для нового случайного ключа RSA.
Используйте встроенные константы BigInteger
.
Не создавайте повторно следующие константы (которые отображаются на странице API выше):
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
Никогда не конвертируйте BigInteger
в long
, если вы не уверены, что оно подойдет.
Вы конвертируете BigInteger
в long
, что является плохой идеей, так как есть много BigInteger
, которые не помещаются в long
, что дает неверные результаты. Для корректности (что важнее скорости) выполняйте арифметические действия напрямую с BigInteger
s.
Вы также часто используете intValue()
, когда получаете long
. Используйте longValueExact()
. Если на то пошло, используйте intValueExact()
, когда вы получаете int
.
Итак, для расчета ϕ:
BigInteger pMinusOne = p.subtract(BigInteger.ONE);
BigInteger qMinusOne = q.subtract(BigInteger.ONE);
BigInteger phi = pMinusOne.multiply(qMinusOne);
Теперь вы знаете, что это даст правильные результаты даже для больших BigInteger
s. Его также не так сложно читать, что хорошо для последующего сопровождения кода.
Что хранить
Вы также должны хранить только n и e (и d, но только если это закрытый ключ) Никогда не хранить < em>p, q или ϕ с RSA, потому что они позволяют легко определить закрытый ключ из открытого ключа.
В общем, не считайте getZZZ
методами
Вы должны вычислить n и e (и d, но только если это закрытый ключ) в методах конструктора и сохранить только те в переменных экземпляра. Затем у вас может быть метод getN()
и getE()
для получения предварительно вычисленных переменных экземпляра. Например (и вам не обязательно использовать этот код, просто чтобы дать представление):
public class RSA {
private final BigInteger n;
private final BigInteger e;
private final BigInteger d;
public RSA(final BigInteger p, final BigInteger q) {
this.n = p.multiply(q);
// Calculate phi
final BigInteger pMinusOne = p.subtract(BigInteger.ONE);
final BigInteger qMinusOne = q.subtract(BigInteger.ONE);
final BigInteger phi = pMinusOne.multiply(qMinusOne);
// Calculate e
BigInteger e = BigInteger.valueOf(3L);
while (! phi.gcd(e).equals(BigInteger.ONE)) {
e = e.add(BigInteger.ONE);
}
this.e = e;
// Calculate d
this.d = e.modInverse(phi);
}
public BigInteger getN() {
return n;
}
public BigInteger getE() {
return e;
}
public BigInteger getD() {
return d;
}
}
person
Chai T. Rex
schedule
28.09.2018
while (GCD.gcd(z).compareTo(ONE) != 0) { temp++; }
Единственное, что меняется, этоtemp
, которая является локальной переменной, поэтому цикл никогда не закончится, поскольку он не меняется - person Scary Wombat   schedule 28.09.2018while (GCD.gcd(z).compareTo(ONE) != 0)
не используетtemp
, поэтому его изменение не имеет значения. - person Scary Wombat   schedule 28.09.2018GCD.gcd(z)
сONE
, и если это сравнение не равно нулю, вы меняете значениеtemp
. Но изменение значенияtemp
никак не влияет ни на одно из сравниваемых значений, поэтому цикл продолжается вечно. - person 1615903   schedule 28.09.2018