В.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 скопировать/вставить текста в элементе Модуля, то же запрашивает экспоненту.
Что я делал неправильно?
Попробуйте следующее:
BigInteger modulus = new BigInteger(1, modulusBytes );
BigInteger exponent = new BigInteger(1, exponentBytes);
В противном случае вы получите отрицательный модуль. Конструктор BigInteger (byte [])
предполагает представление со знаком с прямым порядком байтов. Конструктор BigInteger (int, byte [])
использует предоставленный бит знака (здесь «1» для «положительного»).
Также будьте осторожны с String.getBytes ()
, он использует платформу «кодировку по умолчанию», которая зависит от конфигурации машины, на которой работает приложение. Если вам нужны воспроизводимые результаты, лучше указать явную кодировку (например, «UTF-8»
).