首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java/Kotlin输出Ed25519键区作为JCE keypair实例和OpenSSH格式

Java/Kotlin输出Ed25519键区作为JCE keypair实例和OpenSSH格式
EN

Stack Overflow用户
提问于 2020-11-13 01:11:58
回答 1查看 557关注 0票数 0

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

  • 将密钥对作为实例提供给第三方SSH库使用。
  • 提供OpenSSH .pub格式的公钥,供用户复制并粘贴到git存储库提供程序(如GitHub (即ssh-ed25519 <encoded key> <comment>)中)

我有两个使用BouncyCastle生成密钥的选项,每个选项都使这些需求中的一个变得简单。

直接使用BouncyCastle生成器生成

代码语言:javascript
复制
val generator = Ed25519KeyPairGenerator()
generator.init(Ed25519KeyGenerationParameters(SecureRandom()))
val pair = generator.generateKeyPair()

这给了我一个包含Ed25519PublicKeyParameters的键,这使得使用BouncyCastle提供的OpenSSHPublicKeyUtil获取OpenSSH .pub格式变得非常容易:

代码语言:javascript
复制
"ssh-ed25519 " + toBase64(OpenSSHPublicKeyUtil.encodePublicKey(publicKey))

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

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

代码语言:javascript
复制
Security.addProvider(BouncyCastleProvider())
val keyPairGenerator: KeyPairGenerator = KeyPairGenerator.getInstance(EdDSAParameterSpec.Ed25519, BouncyCastleProvider.PROVIDER_NAME)
keyPairGenerator.initialize(EdDSAParameterSpec(EdDSAParameterSpec.Ed25519), SecureRandom())
val pair = keyPairGenerator.generateKeyPair()

这给了我正在寻找的JCE KeyPair,但没有明显的方法将其转换为OpenSSH .pub格式。这个RSA特有的问题中的答案都只支持DSA/RSA,或者建议库似乎也无法处理Ed25519密钥。我试过:

  • Apache SSHD
  • SSHJ
  • 杰希

我认为我需要的

下列任何一种:

  • 从Bouncy城堡的AsymmetricCipherKeyPair到JCE KeyPair的转换方法
  • 一种从Ed25519PublicKeyParameters包装器获取BCEdDSAPublicKey实例的方法,以便我可以使用Bouncy城堡的OpenSSH实用程序方法
  • 另一种以BouncyCastle格式从KeyPair生成Ed25519公钥的方法
  • 另一种方法/库来生成支持我的两个需求的Ed25519键区
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-13 10:53:50

使用反射(封装为扩展属性的getter )进行黑客攻击,方法2(从Ed25519PublicKeyParameters获取BCEdDSAPublicKey实例)如下:

代码语言:javascript
复制
val BCEdDSAPublicKey.pubKey
    get() = BCEdDSAPublicKey::class.declaredMemberProperties
        .find { it.returnType.javaType == AsymmetricKeyParameter::class.java }!!
        .apply { isAccessible = true }
        .get(this) as AsymmetricKeyParameter
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64814085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档