Ваш lcm()
неверен.
Java long
- это только 64 бита, включая знак, и не может представлять числа больше 2 ^ 63.(Или равно, но большое простое число никогда не равно степени 2). Таким образом, ваше вычисление lcm
должно работать для p, q до 63 бит, и работает для меня, но дает совершенно неправильные и бесполезные результаты для чего-то большего,Вместо этого используйте {p,q}.subtract(BigInteger.ONE)
для чисел, которые вы умножаете и делите на gcd.
Кроме того, BigInteger.probablePrime(int,Random)
- это метод static
(он же класс);вам не нужно вызывать его с использованием какого-либо экземпляра, тем более случайного значения, которое вы потратили впустую на вычисления, потому что оно игнорируется.В этом отношении BigInteger.valueOf(long)
также static
и игнорирует любой экземпляр, используемый для его вызова.Если вы используете какую-либо среду разработки Java более продвинутую, чем просто набирать javac
для оболочки или COMMAND, она должна (по крайней мере, опционально) предупредить вас об использовании экземпляра для вызова статического метода.
Наконец, если вы не знаете, использование примитивов RSA m ^ e mod n и c ^ d mod n напрямую для шифрования / дешифрования данных, особенно небольших данных, небезопасно.Вы должны использовать достаточно большую и случайную схему заполнения, чтобы это вообще было безопасно;см. wikipedia для краткого объяснения, и если вы хотите больше поиска по https://crypto.stackexchange.com и, возможно, https://security.stackexchange.com, где об этом спрашивали и отвечали много раз,И если вы расшифровываете (что вы не показывали), просто делая c.modPow(d,n)
, то это неэффективно (см. Википедию о CRT) и небезопасно (см. Википедию о времени атаки, и снова crypto.SX и security.SX).А использование RSA напрямую для данных является очень ограниченным и неэффективным, поэтому на практике люди используют гибридное шифрование - используют симметричный алгоритм (в настоящее время обычно AES) для шифрования данных с использованием одноразового ключа и шифрования этого одноразового ключа.используя RSA - или, возможно, лучше получить , используя RSA-KEM (снова см. википедию crypto.SX security.SX).
Если вы действительно хотите обеспечить безопасность , а не просто поиграть, используйте криптографию из библиотеки Java , которая была правильно реализована (и проверена) компетентными людьми,в отличие от вашего кода.