我正在使用Ed25519库在Kotlin应用程序中生成BouncyCastle密钥对,并且有两个需求可以单独实现,但似乎很难同时实现:
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))...but从这里到JCE KeyPair没有明显的方法。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()这给了我正在寻找的JCE KeyPair,但没有明显的方法将其转换为OpenSSH .pub格式。这个RSA特有的问题中的答案都只支持DSA/RSA,或者建议库似乎也无法处理Ed25519密钥。我试过:
我认为我需要的
下列任何一种:
AsymmetricCipherKeyPair到JCE KeyPair的转换方法Ed25519PublicKeyParameters包装器获取BCEdDSAPublicKey实例的方法,以便我可以使用Bouncy城堡的OpenSSH实用程序方法KeyPair生成Ed25519公钥的方法发布于 2020-11-13 10:53:50
使用反射(封装为扩展属性的getter )进行黑客攻击,方法2(从Ed25519PublicKeyParameters获取BCEdDSAPublicKey实例)如下:
val BCEdDSAPublicKey.pubKey
get() = BCEdDSAPublicKey::class.declaredMemberProperties
.find { it.returnType.javaType == AsymmetricKeyParameter::class.java }!!
.apply { isAccessible = true }
.get(this) as AsymmetricKeyParameterhttps://stackoverflow.com/questions/64814085
复制相似问题