Почему мое шифрование Java RSA дает мне арифметическое исключение? - PullRequest
6 голосов
/ 22 апреля 2010

В .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 является копией / вставкой текста в элементе Modulus, то же самое относится и к показателю степени.

Что я сделал не так?

1 Ответ

10 голосов
/ 22 апреля 2010

Попробуйте:

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

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

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

...