首页 > 解决方案 > 从 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 返回正确的密钥)

我是不是误会了什么?我做错了吗?我无法弄清楚,搜索谷歌的深度显示了我使用的相同方法。

我感谢所有帮助或提示!

标签: javasecuritycryptographypublic-key-encryption

解决方案


您正在尝试 Base64 解码十六进制编码的字符串。相反,您需要将十六进制值解码为byte[]. 看看这个答案以了解如何。

但是,使用 RSA 签名是使用私钥完成的。我不确定您打算如何使用两个公钥来签名。您可以查看RSA 签名验证是如何工作的?,也许我误解了什么。

此外,您有两个由 API 返回的 64 个字符的字符串。假设它们是十六进制编码的,它们中的每一个都将转换为 32 字节或 256 位。您的帖子标题提到了 512 位,因此看起来这些可能是单个密钥的两半……您尝试做的事情有问题。


推荐阅读