如何用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
相关产品推荐
相关产品推荐

