Kann private key nicht laden

Hey Leute, hab aktuell das Problem, dass ich versuche Sachen zu ver- und entschlüsseln. Das Verschlüsseln ist kein Problem. Ich lade mittels BouncyCastle ein selbsterstelltes Zertifikat und lade dann aus diesem den public key zum verschlüsseln (Der Vollständigkeit halber eben noch: ich nehm meinen eigenen public key, weils entsprechend erstmal nur getestet werden soll…).
Aber wenn ich den Text jetzt wieder entschlüsseln will, stehe ich vor dem Problem, dass ich nicht rauskriege, wie ich meinen private key einlesen kann… meinen key habe ich folgendermaßen generiert:
Auf Linux mit folgendem Befehl
ssh-keygen -t rsa -b 2048
damit hab ich dann die entsprechend bekannte id_rsa Datei, die ich nun in java einlesen will, woran ich aber bereits seit Tagen scheitere…
Wäre echt super, wenn mit hier jemand weiterhelfen kann… immerhin sollte das ja eigentlich nun wirklich nicht das Problem sein, son blöden private key einzulesen…

Moin,

versuchs mal so:

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Security;
import java.security.spec.PKCS8EncodedKeySpec;

import javax.xml.bind.DatatypeConverter;

import org.bouncycastle.jce.provider.BouncyCastleProvider;


public class Test {


    static {

        Security.addProvider(new BouncyCastleProvider());

    }


    private static final Charset ENCODING = StandardCharsets.UTF_8;
    private static final String BEGIN = "-----BEGIN RSA PRIVATE KEY-----";
    private static final String END = "-----END RSA PRIVATE KEY-----";


    public static PrivateKey readPrivateKey(final String filename) throws Exception {

        final StringBuilder sb = new StringBuilder();
        final Path path = Paths.get(filename);
        try (BufferedReader reader = Files.newBufferedReader(path, ENCODING)) {

            String line = null;
            while ((line = reader.readLine()) != null)
                sb.append(line);

        }

        String s = sb.toString();
        s = s.replace(BEGIN, "");
        s = s.replace(END, "");

        final byte[] privateKeyData = DatatypeConverter.parseBase64Binary(s);
        final KeyFactory privateKeyFactory = KeyFactory.getInstance("RSA", "BC");
        final PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(privateKeyData);
        final PrivateKey privateKey = privateKeyFactory.generatePrivate(encodedKeySpec);

        return privateKey;

    }


    public static void main(final String[] args) throws Exception {

        final PrivateKey privateKey = readPrivateKey("id_rsa");

        System.out.println(privateKey);

    }

}```

Viele Grüße
Fancy

Funktioniert danke.
Witzigerweise hab ich jetzt allerdings wieder ein weiteres Problem… Wenn ich jetzt einen Text verschlüssel und ihn im Anschluss direkt wieder entschlüssel läuft alles wunderbar. Wenn ich den verschlüsselten Text jedoch in einer Datei speicher und ihn dann im Anschluss aus der Datei wieder entschlüsseln will, bekomme ich eine “javax.crypto.BadPaddingException: Data must start with zero”.
Dass da ein einheitliches Padding rein muss ist schon klar. Aber daran sollte es eigentlich nicht liegen. Jemand ne Ahnung wie man das umgehen kann? Hab woanders gelesen, dass der häufigste Grund für diese Fehlermeldung die Umwandlung von bytes in String ist und der Fehler dann halt auftritt, wenn man es wieder entschlüsseln will. Da stellt sich mir dann doch die Frage: “und was mach ich jetzt dagegen?” das war nämlich nicht direkt beschrieben…
Danke in jedem Falle schonmal für die letzte Hilfestellung!

Naja du koenntest doch einfach statt mit Strings mit einem Byte-Array arbeiten?

ähm ja, das hab ich ja auch im ersten Moment. Aber wie ich sagte, soll der verschlüsselte Text in eine Datei, dann aus einer Datei wieder eingelesen werden um dann wieder entschlüsselt zu werden. Aber ich habe die Lösung eben gerade gefunden. Die Antwort auf das Problem ist einfach bloß die Zeichen-Kodierung. Wenn mans erstmal weiß, ergibts Sinn, aber wenn man nicht drüber nachdenkt, ist es schon ein fieses Mysterium. Sind zum Glück auch nur 2 Zeilen Code die ich anpassen musste ^^
http://coding.westreicher.org/?p=23