Java/Kotlin将Ed25519密钥对输出为JCE KeyPair实例和OpenSSH格式 [英] Java/Kotlin Output Ed25519 keypair as both JCE KeyPair instance and in OpenSSH format
本文介绍了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实现似乎使用BCEdDSAPublicKey
和BCEdDSAPrivateKey
作为包装类来实现此目的,但它们的构造函数是包私有的。
使用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
我认为我需要什么
下列任何一项:
- 从BouncyCastle
AsymmetricCipherKeyPair
转换为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屋!
查看全文