在Android上生成用于SSH登录的RSA私钥/公钥对

6

我正在处理一个项目,需要我的应用程序生成用于SSH登录的公钥/私钥RSA密钥。

到目前为止,我有以下代码来获取密钥:

private void createKeyTest()
    {
        try
        {
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(2048);
            KeyPair keyPair = kpg.genKeyPair();
            byte[] pri = keyPair.getPrivate().getEncoded();
            byte[] pub = keyPair.getPublic().getEncoded();

            String privateKey = new String(pri);
            String publicKey = new String(pub);

            Log.d("SSHKeyManager", "Private Key: " + privateKey);
            Log.d("SSHLeyManager", "Public Key: " + publicKey);
        }
        catch (NoSuchAlgorithmException ex)
        {
            Log.e("SSHKeyManager", ex.toString());
        }

当我在Logcat中打印出这个时,我得到了一些随机的非文本字符,而我期望的密钥看起来应该像:

-----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEAm8QDThbuEjAbQxbsdDltL2xdFkQOep3L0wseSJAxmDuvH6yB
9I2fEEmF+dcVoNo2DGCDZMw7EgdFsfQZNF+PzKdZwtvSUTDW/TmMHWux2wYimNU3
jhQ3kfxGmiLgMJHQHWLkESwd06rCr7s1yOnPObdPjTybt7Odbp9bu+E59U10Ri3W
JFxIhi9uYQvpRn4LT/VIfH/KBdglpbD9xBAneVbKFXW7....
-----END RSA PRIVATE KEY-----

你有没有考虑过是否正确获取了 --- --- 部分中包含的字符串? - OneCricketeer
1
对一些字节数组使用new String()不会得到字节的Base64编码(或者用于RSA文件的任何其他编码)。 - CommonsWare
啊,是的,我忘了这一点了。我已经尝试对其进行Base 64编码,但是该字符串看起来总是比在Linux框上使用ssh-keygen -t rsa命令生成时短得多。 - Boardy
@Boardy - 这期间有没有什么解决方案? - Drahoš Maďar
1个回答

5
import android.util.Base64;

您可以更改

String privateKey = Base64.encodeToString(pri, Base64.DEFAULT);
String publicKey = Base64.encodeToString(pub, Base64.DEFAULT);

那将让您拥有公钥和私钥的Base64版本。
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

这些格式被称为 PEM,您可以自定义添加或使用库“bouncycastle”。
以下是 bouncycastle 示例:使用java将RSA公钥导出为PEM字符串

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接