我可以在不使用 JSch 解锁的情况下获取锁定的 SSH 私钥的类型或指纹吗?

Can I get the type or fingerprint of a locked SSH private key without unlocking it using JSch?

我可以得到 type (RSA, DSA, ECDSA, ED25519...) 或者指纹 密码保护的私人 ssh 密钥,无需使用 JSch 解锁(就像在 Linux 中使用 ssh-keygen -l -f <key_file>)?

我正在编写一个 Android 应用程序,JSch 几乎是我设法使用 Android 的唯一库,所以它有使用 JSch 或手动完成。

使用KeyPair.load加载密钥。

然后 KeyPair.getKeyType and KeyPair.getFingerPrint 访问其属性。

JSch jSch = new JSch();
KeyPair keypair = KeyPair.load(jSch, filename);
System.out.println(keypair.getKeyType());
System.out.println(keypair.getFingerPrint(jSch));

Martin Prikryl 的回答是正确的,但是我问了这个问题,因为当我打电话给 getKeyType() 时收到 IllegalStateException 消息 encrypted key has not been decrypted yet. 所以我认为你无法获取有关锁定密钥的信息。经过更多的试验和错误后,我发现问题是特定于 JSch 的分支,我使用 (com.github.mwiede:jsch:0.2.1) 添加了对 ED25519 键的支持,并且问题特定于 ED25519 个键。我这样解决了我的问题:

private static int getKeyType(Path keyFilePath) {
    try {
        Path keyFile = keyFilePath;
        final byte[] key = Files.readAllBytes(keyFile);
        final JSch jSch = new JSch();
        final KeyPair keyPair = KeyPair.load(jSch, key, null);
        return keyPair.getKeyType();
    } catch (final IOException | JSchException e) {
        System.err.println(e.getMessage());
        return 0; // 0 is the key type of ERROR defined in the KeyPair class
    } catch (IllegalStateException e) {
        if (e.getMessage().equals("encrypted key has not been decrypted yet."))
            return 5; // 5 is the key type of ED25519 defined in the KeyPair class
        e.printStackTrace();
        return 0;
    }
}