You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Kotlin从RSA私钥生成ECDSA、DER、RPB格式公钥

问题:从RSA私钥生成指定格式公钥的Kotlin实现

我持有一个RSA私钥,需要提取出以下格式的公钥:

  • ECDSA格式公钥
  • DER格式公钥
  • RPB格式公钥

我已经实现了从RSA私钥获取RSA格式公钥的Kotlin代码:

import java.security.KeyFactory
import java.security.PrivateKey
import java.security.PublicKey
import java.security.spec.PKCS8EncodedKeySpec
import java.security.interfaces.RSAPrivateCrtKey
import java.security.spec.RSAPublicKeySpec
import java.util.Base64
import java.security.KeyPair
import java.security.KeyPairGenerator

const val ALGORITHM = "RSA"


fun generateKeyPair(): KeyPair {
    val keyPairGenerator = KeyPairGenerator.getInstance("RSA")
    keyPairGenerator.initialize(2048) // 可按需调整密钥长度
    return keyPairGenerator.generateKeyPair()
}

fun generatePublicKey(privateKeyString: String): PublicKey {
    try {
        val kf = KeyFactory.getInstance(ALGORITHM)
        val encodedPrivateKey = Base64.getDecoder().decode(privateKeyString)
        val privateKeySpec = PKCS8EncodedKeySpec(encodedPrivateKey)
        val rsaPrivateKey = kf.generatePrivate(privateKeySpec) as RSAPrivateCrtKey

        val publicKeySpec = RSAPublicKeySpec(rsaPrivateKey.modulus, rsaPrivateKey.publicExponent)
        return kf.generatePublic(publicKeySpec)
    } catch (e: Exception) {
        throw RuntimeException(e)
    }
}

fun main() {
    val keyPair = generateKeyPair()
    // val publicKey: PublicKey = keyPair.public
    val privateKey: PrivateKey = keyPair.private
    // 用示例私钥字符串测试
    val privateKeyString = Base64.getEncoder().encodeToString(privateKey.encoded)
    println("Generated Private Key: $privateKeyString")
    //val privateKeyString = "YOUR_PRIVATE_KEY_STRING_HERE"
    val publicKey = generatePublicKey(privateKeyString)
    println("Generated Public Key: ${Base64.getEncoder().encodeToString(publicKey.encoded)}")
}

我原本以为java.security.spec中存在ECDSAPublicKeySpec、DERPublicKeySpec和RPBPublicKeySpec,但实际并没有。我尝试过使用Bouncy Castle库,但仍然无法从私钥转换得到这三种格式的公钥。

我知道OpenSSL可以通过几条命令实现这些操作,但我无法使用OpenSSL或其包装器,必须通过Kotlin完成。我了解Java加密扩展(JCE)和Bouncy Castle可以扩展Java加密功能,特此寻求解决方案。


补充:需要实现的对应OpenSSL命令

以下是我想要用Kotlin(及Java库)实现的OpenSSL命令,重点关注标注**--> 需要实现 <--**的部分:

# 私钥 --> 已拥有
openssl genrsa -out priv.pem 2048

# 公钥 --> 已拥有
openssl rsa -in priv.pem -pubout -out pub.pem

# 公钥PEM格式 --> 已拥有
openssl pkey -inform PEM -pubin -in pub.pem -text -noout

# 公钥DER格式 --> **--> 需要实现 <--**
openssl rsa -pubin -inform PEM -in pub.pem -outform DER -out pub.der

# 公钥RPB格式 --> 暂时无需关注
openssl rsa -pubin -inform PEM -in pub.pem -outform RPB -out pub.rpb

# ECDSA相关
# ECDSA私钥 --> 已拥有
openssl ecparam -genkey -out ecdsa_priv.pem -name prime256v1

# ECDSA公钥 --> **--> 需要实现 <--**
openssl ec -in ecdsa_priv.pem -pubout -out ecdsa_pub.pem

# ECDSA公钥DER格式 --> **--> 需要实现 <--**
openssl ec -pubin -inform PEM -in ecdsa_pub.pem -outform DER -out ecdsa_pub.der

内容的提问来源于stack exchange,提问作者user2517182

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:20:17