Почему мое шифрование RSA Java дает мне Арифметическое исключение?

В.NET я генерировал следующий файл с открытым ключом:

<RSAKeyValue>
   <Modulus>xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk=</Modulus>
   <Exponent>AQAB</Exponent>
</RSAKeyValue>

.NET рада зашифровать использование, это - нормальные методы.

Я пытаюсь использовать этот ключ для кодирования строки в Java. Я сталкиваюсь с Арифметическим исключением, когда я пытаюсь зашифровать строку.

Следующее является кодом, который я использую для шифрования:

byte[] modulusBytes = Base64.decode(this.getString(R.string.public_key_modulus));
byte[] exponentBytes = Base64.decode(this.getString(R.string.public_key_exponent));
BigInteger modulus = new BigInteger( modulusBytes );                
BigInteger exponent = new BigInteger( exponentBytes);

RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(rsaPubKey);

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);

byte[] cipherData = cipher.doFinal( new String("big kitty dancing").getBytes() );    

Это - заключительная строка в блоке кода, который перестал работать.

Я посмотрел на многочисленные примеры, и это является лучшим, я мог придумать. Если это не очевидно, R.string.public_key_modulus скопировать/вставить текста в элементе Модуля, то же запрашивает экспоненту.

Что я делал неправильно?

6
задан Paŭlo Ebermann 23 August 2011 в 00:01
поделиться

1 ответ

Попробуйте следующее:

BigInteger modulus = new BigInteger(1, modulusBytes );
BigInteger exponent = new BigInteger(1, exponentBytes);

В противном случае вы получите отрицательный модуль. Конструктор BigInteger (byte []) предполагает представление со знаком с прямым порядком байтов. Конструктор BigInteger (int, byte []) использует предоставленный бит знака (здесь «1» для «положительного»).

Также будьте осторожны с String.getBytes () , он использует платформу «кодировку по умолчанию», которая зависит от конфигурации машины, на которой работает приложение. Если вам нужны воспроизводимые результаты, лучше указать явную кодировку (например, «UTF-8» ).

11
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: