# String to RSAPublicKey



## Daywackler (5. Aug 2014)

Hallo liebe Community,

ich möchte gerne eine PKI programmieren und arbeite hier mit auch mit digitalen Signaturen (x509-Standard).
Um ein neues Zertifikat in meine PKI/Datenbank aufnehmen zu können muss der Anwender die Challenge lösen. Hierzu erzeuge ich eine zufällige Zahl zwischen 1 und 1Mio und verschlüssle diese mit dem Public-Key des angegebenen/neuen Zertifikat. Der Benutzer kann die Zahl nun mit seinem Private-Key entschlüsseln und schickt der PKI das Ergbnis mit dem Public-Key der PKI verschlüsselt zurück.

Mein Problem ist gerade, dass ich aus einem String keinen RSAPublicKey bekomme. Meine Keys habe ich durch den putty key generator erzeugen lassen. Meine Einstellungen waren dabei:
1024 Bits 
Type of key to generated: SSH-2 RSA

Hier ist mal mein Programmversuch für die Konvertierung:

```
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;

import javax.xml.bind.DatatypeConverter;


public class RSAcryptography {
	
	private String publicK = "AAAAB3NzaC1yc2EAAAABJQAAAIEA2JtgJTOltnBgOHi7LqzHkbQIHMRP7jilADeR"
			+"O5PeGzUuAcyoSaif87iWZ+yYVIyTuCGUAM1GcmAA5eu1HiIQci0Ypljc+1hx6MGz"
			+"QytPWA8I/mRHDAmZQNuj8CIwB5mD8Yzlf2Qx6xNw/sIwJLA01XnJMuUXFH7lVqOI"
			+"SBHlFdU=";
	
	private void stringToPubkey () {
		byte[] keyBytes;
		try {
			keyBytes = DatatypeConverter.parseBase64Binary(
				      new String(publicK.getBytes("utf-8"), Charset.forName("UTF-8")));
			X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			PublicKey key = keyFactory.generatePublic(spec);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		RSAcryptography test = new RSAcryptography();
		test.stringToPubkey();
	}
}
```

Die Fehlermeldung:

```
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
	at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(Unknown Source)
	at java.security.KeyFactory.generatePublic(Unknown Source)
	at RSAcryptography.stringToPubkey(RSAcryptography.java:26)
	at RSAcryptography.main(RSAcryptography.java:38)
Caused by: java.security.InvalidKeyException: invalid key format
	at sun.security.x509.X509Key.decode(Unknown Source)
	at sun.security.x509.X509Key.decode(Unknown Source)
	at sun.security.rsa.RSAPublicKeyImpl.<init>(Unknown Source)
	at sun.security.rsa.RSAKeyFactory.generatePublic(Unknown Source)
	... 4 more
```


Ich bin mit meinem Wissen hier leider am ende. Habe mir auch schon viele Beispiele im Netz angesehen und ausprobiert. Leider hat mir nichts geholfen. Vielleicht habt ihr eine Idee oder einen Vorschlag.

Ich danke euch schon mal.

Viele Grüße 
Daywackler


----------



## VfL_Freak (5. Aug 2014)

Moin,

bin jetzt kein ausgewiesener RSA-Experte, aber habe es mal kurz gegoogled ("RSA invalid key format") ... 

Dabei kommen so einige interessante Links zum Vorschein - etwa:

Juniper Networks - [WebappSecure/Mykonos] JWAS complains about "Invalid private key" although the ssl key works fine on other network devices - Knowledge Base
Wie RSA Private Key aus der Datei geladen | Technischen F&A
java - InvalidKeySpecExeption when loadding the RSA private key from file - Stack Overflow
web applications - InvalidKeyException: invalid key format in Java using RSA Keys - Stack Overflow

Da sollte doch was dabei sein, oder ??

Gruß
Klaus


----------



## lawila (5. Aug 2014)

das problem ist wie die keys erzeugt werden



> Meine Keys habe ich durch den putty key generator erzeugen lassen.



gut, dann solltest du dir mal die doc dazu durchlesen ... denn das was der putty-gen da erzeugt ist kein reiner RSA-key den java nach lesen könnte sondern ein komplexes zertifikats-konstrukt was nun mal für den algorithmus und die verarbeitung durch SSH gedacht ist, java selbst kann das aber nicht weshalb es zur exception kommt


----------



## Thallius (5. Aug 2014)

Du kannst aber den SSH keygen nutzen um dir die Keys zu extrahieren

putty - How to convert SSH keypairs generated using PuttyGen(Windows) into key-pairs used by ssh-agent and KeyChain(Linux) - Stack Overflow

Gruß

Claus


----------



## lawila (5. Aug 2014)

ich würde einfach mit java keys erzeugen ... schon alleine deshalb weil diese dann in einem format vorliegen was java auf jedenfall sauber rausschreiben und auch vernünftig wieder einlesen kann

@TO
weiteres problem beim putty-gen
der generator verlangt normalerweise nach einem key-passwort um diesen zu sichern
hier muss man dann also drauf achten das man einen "offenen" schlüssel hat ... denn sonst kann java trotzdem nichts mit anfangen wenn man zwar einen "sauberen" schlüssel hat, dieser jedoch noch mit einem kennwort gesichert ist (müsste zwar i-wie mit PBE was machbar sein .. dafür müsste man sich aber mal den algo aus putty rausfrimeln)


----------



## Daywackler (7. Aug 2014)

Ich danke euch für eure schnelle Hilfe, aber wie es sich herausstellte habe ich mit den falschen Daten gearbeitet. Was mir sehr peinlich ist  :bloed:

Die Lösung meines Problems war doch um einiges leichter wie ich zuerst angenommen hatte. Ich bekomme ja ein X509 Zertifikat mit allen Daten. Dort finde ich auch den Modulus und den Exponent des Public Keys und kann mir daraus in ein paar Zeilen super einfach den Public Key erstellen lassen.


----------

