Java/Kotlin将Ed25519密钥对输出为JCE KeyPair实例和OpenSSH格式 [英] Java/Kotlin Output Ed25519 keypair as both JCE KeyPair instance and in OpenSSH format

查看:22
本文介绍了Java/Kotlin将Ed25519密钥对输出为JCE KeyPair实例和OpenSSH格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用BouncyCastle库在我的Kotlin应用程序中生成Ed25519密钥对,并且有两个要求很容易单独实现,但似乎很难同时实现:

  • JCE KeyPair instance的形式提供密钥对,以便与第三方SSH库一起使用
  • 提供OpenSSH.Pub格式的公钥,供用户复制粘贴到GitHub等Git仓库提供者(即ssh-ed25519 <encoded key> <comment>)

我有两个使用BouncyCastle生成密钥的选项,每个选项都只简化了其中一个要求。

使用BouncyCastle生成器直接生成

val generator = Ed25519KeyPairGenerator()
generator.init(Ed25519KeyGenerationParameters(SecureRandom()))
val pair = generator.generateKeyPair()

这给了我一个包含Ed25519PublicKeyParameters的密钥,这使得使用BouncyCastle:

提供的OpenSSHPublicKeyUtil获取OpenSSH.Pub格式非常容易
"ssh-ed25519 " + toBase64(OpenSSHPublicKeyUtil.encodePublicKey(publicKey))

...但是没有明显的方法可以从这里到达JCE。BouncyCastle JCE实现似乎使用BCEdDSAPublicKeyBCEdDSAPrivateKey作为包装类来实现此目的,但它们的构造函数是包私有的。

使用BouncyCastle作为JCE安全提供程序生成

Security.addProvider(BouncyCastleProvider())
val keyPairGenerator: KeyPairGenerator = KeyPairGenerator.getInstance(EdDSAParameterSpec.Ed25519, BouncyCastleProvider.PROVIDER_NAME)
keyPairGenerator.initialize(EdDSAParameterSpec(EdDSAParameterSpec.Ed25519), SecureRandom())
val pair = keyPairGenerator.generateKeyPair()

这给了我正在寻找的JCEKeyPair,但没有明显的方法将其转换为OpenSSH.Pub格式。this RSA-specific question中的答案都只支持DSA/RSA,或者建议的库似乎也不能处理Ed25519密钥。我已尝试:

  • ApacheSSHD
  • 宋承宪
  • jsch

我认为我需要什么

下列任何一项:

  • 从BouncyCastleAsymmetricCipherKeyPair转换为JCEKeyPair的方法
  • BCEdDSAPublicKey包装中获取Ed25519PublicKeyParameters实例以便使用BouncyCastle的OpenSSH实用程序方法的方法
  • 从OpenSSH格式的KeyPair输出BouncyCastle生成的Ed25519公钥的另一种方式
  • 生成支持我的两个要求的Ed25519密钥对的另一种方法/库

推荐答案

使用反射进行黑客攻击(包装到扩展属性的Getter中),方法2(从BCEdDSAPublicKey获取Ed25519PublicKeyParameters实例):

val BCEdDSAPublicKey.pubKey
    get() = BCEdDSAPublicKey::class.declaredMemberProperties
        .find { it.returnType.javaType == AsymmetricKeyParameter::class.java }!!
        .apply { isAccessible = true }
        .get(this) as AsymmetricKeyParameter

这篇关于Java/Kotlin将Ed25519密钥对输出为JCE KeyPair实例和OpenSSH格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆