2010-04-22 15 views
6

En .NET que han generado el siguiente archivo de clave pública:¿Por qué mi encriptación Java RSA me da una excepción aritmética?

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

.NET es feliz para cifrar utilizando su métodos normales.

Estoy tratando de usar esta clave para codificar una cadena en Java. Me encuentro con una excepción aritmética cuando intento encriptar la cadena.

El siguiente es el código que estoy utilizando para cifrar:

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());  

Es la última línea en el bloque de código que falla.

He examinado numerosos ejemplos y esto es lo mejor que pude encontrar. Si no es obvio, el R.string.public_key_modulus es una copia/pega del texto en el elemento Modulus, lo mismo aplica para el exponente.

¿Qué hice mal?

Respuesta

10

Prueba esto:

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

De lo contrario se termina con un módulo negativo. El constructor BigInteger(byte[]) supone una firmada representación big-endian. El constructor BigInteger(int, byte[]) usa el bit de signo proporcionado (aquí "1" para "positivo").

Además, tenga cuidado con String.getBytes(), utiliza la plataforma "juego de caracteres predeterminado" que depende de la configuración de la máquina en la que se ejecuta la aplicación. Es mejor especificar un juego de caracteres explícito (por ejemplo, "UTF-8") si desea resultados reproducibles.

+0

sí, eso lo resolvió muy bien, gracias por la respuesta rápida! – badMonkey

Cuestiones relacionadas