В рамках одного из моих университетских заданий меня попросили написать алгоритм RSA для шифрования пользовательского сообщения. Мой код шифрования здесь:
BigInteger byte_message = new BigInteger(user_message.getBytes());
BigInteger encrypted_message = byte_message.modPow(public_key, modulus);
Тогда для расшифровки мой код в настоящее время:
BigInteger cipher = new BigInteger(encrypted_message);
BigInteger decrypted_message = cipher.modPow(private_key, modulus);
Ошибка, которую бросает мне Java:
**The constructor BigInteger(BigInteger) is undefined.
1 quick fix available: Change type of 'encrypted_message' to 'byte[]'**
Как мне преобразовать encrypted_message из байтов в BigInteger, чтобы затем я мог запустить раздел modPow моего кода?
Любая помощь высоко ценится!




encrypted_message уже является BigInteger. Нет необходимости создавать из него new BigInteger, потому что вы можете просто назначить его cipher:
BigInteger cipher = encrypted_message;
Также обратите внимание, что BigInteger (как и String) является неизменяемым, поэтому (обычно) нет причин создавать новый экземпляр BigInteger, равный тому, который у вас уже есть.
Да, но если я сделаю это, а затем сделаю: BigInteger decrypted_message = cipher.modPow (private_key_file, modulus); System.out.println ("Расшифрованное сообщение = " + decrypted_message); Вывод не совпадает с моим исходным сообщением.
@JamesKemp Тогда это должна быть несвязанная ошибка в вашем коде. Если ваша цель для линии BigInteger cipher = new BigInteger(encrypted_message); состоит в том, чтобы cipher был BigInteger, равным encrypted_message, то cipher = encrypted_message - правильный подход для этой линии.
Как указывает @pkpnd, нет необходимости делать копию объекта BigInteger, на который ссылается encrypted_message. Достаточно простого присвоения ссылки.
В (крайне ограниченном) случае, когда вам действительно нужно это сделать, вы можете сделать копию следующим образом:
BigInteger cipher = new BigInteger(encrypted_message.toByteArray());
(Они не предоставили ни метод BigInteger.clone(), ни конструктор BigInteger(BigInteger), поскольку копирование этих объектов почти всегда излишне и неэффективно. Они неизменяемы.)
How do I convert the encrypted_message from bytes to BigInteger so that I can then run the modPow section of my code?
Тебе это не нужно. Вы уже сделали это в начале своего кода, и вам не нужно делать это снова. (И если вы В самом деле сделаете это второй раз, то сделайте это так же, как вы делали в начале кода!)
1 quick fix available: Change type of 'encrypted_message' to 'byte[]'**
Обратите внимание, что исправления, предлагаемые вашей IDE, не всегда лучший совет. Компилятор IDE не выполняет понимать того, что вы собираетесь делать в своем коде. Для этого нужен человеческий мозг.
Заголовок и текст вашего вопроса не совпадают. В заголовке сказано, что вы спрашиваете о преобразовании байтового массива в
BigInteger. В теле вы четко знаете, как это сделать, и на самом деле спрашиваете, как сделать копиюBigInteger. Я исправил это.