我调用返回 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")
这个公钥应该是正确的(我确信 API 返回正确的密钥)
我是不是误会了什么?我做错了吗?我无法弄清楚,谷歌的搜索深度显示了我使用的方法。
我感谢所有的帮助或提示!
您正在尝试 Base64 解码十六进制编码的字符串。相反,您需要解码十六进制值以byte[]
。看看这个答案就知道怎么做。
但是,使用RSA 进行签名是使用私钥完成的。我不确定您打算如何使用两个公钥来签名。您可以查看RSA签名验证如何工作?,也许我误解了什么。
此外,API 还返回了两个 64 个字符的字符串。假设它们是十六进制编码的,它们中的每一个都将转换为 32 字节或 256 位。您的帖子标题提到了 512 位,所以看起来这些可能是单个键的两半......你想做的事情有问题。