java - 从 512 位字符串创建 PublicKey
问题描述
我调用返回 2 个公钥(作为字符串)的 API,每个公钥由 512 位组成:
588506d0c604d8270ac4de9fdc520abe4779128ff5b7940d38fcd13d5e5fd07f
455c2c7b4e4a873c40f46b8e2bdfd90214591c3110b3c7ab7458818af3c59649
我需要做的是PublicKey
从它们创建对象以便签署数据。(每个键对应不同的数据)
但是,我正在尝试做的事情会引发错误:
KeyFactory kf = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyContent));
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509);
错误是:
java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:DerInputStream.getLength():lengthTag=79,太大。
(每个键在 eror 中都有不同的“lengthTag”)
这个 publicKeys 应该是正确的(我确信 API 返回正确的密钥)
我是不是误会了什么?我做错了吗?我无法弄清楚,搜索谷歌的深度显示了我使用的相同方法。
我感谢所有帮助或提示!
解决方案
您正在尝试 Base64 解码十六进制编码的字符串。相反,您需要将十六进制值解码为byte[]
. 看看这个答案以了解如何。
但是,使用 RSA 签名是使用私钥完成的。我不确定您打算如何使用两个公钥来签名。您可以查看RSA 签名验证是如何工作的?,也许我误解了什么。
此外,您有两个由 API 返回的 64 个字符的字符串。假设它们是十六进制编码的,它们中的每一个都将转换为 32 字节或 256 位。您的帖子标题提到了 512 位,因此看起来这些可能是单个密钥的两半……您尝试做的事情有问题。
推荐阅读
- c# - 使用 LightweightExcelReader 将 Excel 转换为 JSON
- search - 如何从 Splunk 中的新 eval 字段名中搜索事件以获取值?
- react-native - react-native-svg-transformer 弄乱字体(react-native-vector-icons)
- firebase - Flutter:如何删除friebase存储中的文件夹
- javascript - 将 glb 转换为 draco glb 前端
- sockets - 通过 VPN 的 TCPIP 连接意外关闭
- python - 对 Numpy 数组的每个元素应用操作的最有效方法
- pycharm - PyCharm 向远程脚本路径添加了一些垃圾
- python - 格式化来自 sns 的消息发布到 https 端点
- android - 苹果cfgutil相当于安卓?