2010-04-22 7 views
6

In .NET habe ich die folgende öffentliche Schlüsseldatei generiert:Warum gibt mir meine Java RSA-Verschlüsselung eine arithmetische Ausnahme?

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

.NET ist glücklich, es ist normal, Methoden zur Verschlüsselung verwendet wird.

Ich versuche, diesen Schlüssel zu verwenden, um eine Zeichenfolge in Java zu codieren. Ich stoße auf eine arithmetische Ausnahme, wenn ich versuche, die Zeichenfolge zu verschlüsseln.

Im Folgenden ist der Code, den ich zu verschlüsseln bin mit:

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 ist die letzte Zeile in dem Codeblock, der fehlschlägt.

Ich habe mir zahlreiche Beispiele angesehen und das ist das Beste, was ich mir vorstellen konnte. Wenn es nicht offensichtlich ist, ist der R.string.public_key_modul ein Kopieren/Einfügen des Textes in dem Modulus-Element, das gleiche gilt für den Exponenten.

Was habe ich falsch gemacht?

Antwort

10

Versuchen Sie folgendes:

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

Andernfalls Sie mit einem negativen Modul enden. Der BigInteger(byte[])-Konstruktor geht von einer signierten Big-Endian-Darstellung aus. Der BigInteger(int, byte[]) Konstruktor verwendet das bereitgestellte Vorzeichenbit (hier "1" für "positiv").

Seien Sie vorsichtig bei String.getBytes(), es verwendet die Plattform "default charset", die von der Konfiguration der Maschine abhängt, auf der die Anwendung ausgeführt wird. Es ist besser, einen expliziten Zeichensatz anzugeben (z. B. "UTF-8"), wenn Sie reproduzierbare Ergebnisse wünschen.

+0

ja, das hat es schön gelöst, danke für die schnelle Antwort! – badMonkey

Verwandte Themen