Crypto.java

package jasper.util;

import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemWriter;

import javax.xml.bind.DatatypeConverter;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.interfaces.RSAPublicKey;

public class Crypto {

    public static KeyPair keyPair() throws NoSuchAlgorithmException {
		var kpg = KeyPairGenerator.getInstance("RSA");
		kpg.initialize(4096);
		return kpg.generateKeyPair();
    }

    public static String writeRsaPrivatePem(PrivateKey privateKey) throws IOException {
        var pkout = new StringWriter();
        try (var writer = new PemWriter(pkout)) {
            writer.writeObject(new PemObject(
                "PRIVATE KEY",
                privateKey.getEncoded()));
        }
        return pkout.toString();
    }

    public static String writeSshRsa(RSAPublicKey publicKey, String comment) throws IOException {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeInt("ssh-rsa".getBytes().length);
        dos.write("ssh-rsa".getBytes());
        dos.writeInt(publicKey.getPublicExponent().toByteArray().length);
        dos.write(publicKey.getPublicExponent().toByteArray());
        dos.writeInt(publicKey.getModulus().toByteArray().length);
        dos.write(publicKey.getModulus().toByteArray());
        return "ssh-rsa " + DatatypeConverter.printBase64Binary(os.toByteArray()) + " " + comment;
    }
}