首页 > 解决方案 > 如何在 android 中从 NIST P-256 字符串私钥生成 PrivateKey

问题描述

我有字符串格式的私钥。它的类型是 NIST P-256,它看起来像这样:

-----BEGIN PRIVATE KEY----- 
MIGH...
HQ9+...
ZYrJ...
-----END PRIVATE KEY-----

我删除了带有页脚和空格的页眉。

我有:

import java.security.KeyFactory
import java.security.PrivateKey
import java.security.spec.PKCS8EncodedKeySpec

val privateKeyString = "myKey"
val sigBytes: ByteArray = Base64Utils.decode(privateKeyString)

val privateKeySpec = PKCS8EncodedKeySpec(sigBytes)
val keyFactory = KeyFactory.getInstance("RSA")

val privateKey : PrivateKey = keyFactory.generatePrivate(privateKeySpec)

我在哪里得到:

Caused by: 
java.security.spec.InvalidKeySpecException: Unexpected key type

我看到了一种人们移除的方法

-----BEGIN PRIVATE KEY----- 和 -----END PRIVATE KEY-----

但它没有帮助。可能我应该使用与 PKCS8EncodedKeySpec 不同的东西但我不确定,请有人帮助我)

标签: androidkotlinsecurityrsaprivate-key

解决方案


要导入的私钥是 PKCS#8 格式的 PEM 编码密钥。PKCS8EncodedKeySpec()需要一个 DER 编码密钥,该密钥通过删除页眉、页脚和换行符从 PEM 编码密钥派生,并对其余部分进行 Base64 解码。

由于要导入 EC 密钥,EC因此必须指定为 algorithm 而不是RSA

val keyFactory = KeyFactory.getInstance("EC")

推荐阅读