android - 如何在 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 不同的东西但我不确定,请有人帮助我)
解决方案
要导入的私钥是 PKCS#8 格式的 PEM 编码密钥。PKCS8EncodedKeySpec()
需要一个 DER 编码密钥,该密钥通过删除页眉、页脚和换行符从 PEM 编码密钥派生,并对其余部分进行 Base64 解码。
由于要导入 EC 密钥,EC
因此必须指定为 algorithm 而不是RSA
:
val keyFactory = KeyFactory.getInstance("EC")
推荐阅读
- html - 如何使用 CSS Flexbox 将文本和图像放在同一行?
- python-3.x - 如何消除python中包含数字的列表中的空格?
- angular - 安装 Angular 之前是否需要安装 Typescript?
- reactjs - App Engine 在 Vanilla React 网站上不断给出错误 500
- c# - Oracle.ManagedDataAccess - 连接未处理 Oracle 错误
- javascript - 使用按钮 f 增加和减少数量
- indexing - 将 `RangeFull` 语法与字符串和 `Borrow` 一起使用
- javascript - 未捕获的类型错误:无法在我正在尝试编写的此博客网站内的文本中读取 null 的属性“innerHTML”
- blockchain - 从哪里获得 Oracle 和 JobID?
- html - 在论坛主题中自动嵌入 URL