从512位字符串中创建公钥

问题描述 投票:2回答:1

我调用返回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返回正确的密钥)

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

我感谢所有帮助或提示!

java security cryptography public-key-encryption
1个回答
0
投票

您正在尝试Base64解码十六进制编码的字符串。相反,您需要将十六进制值解码为byte[]。看看at this answer了解如何。

但是,通过RSA签名是通过private密钥完成的。我不确定您打算如何使用两个公共密钥对某些内容进行签名。您可以检查How does RSA signature verification work?,也许我误会了。

此外,API返回了两个64个字符串。假设它们是十六进制编码的,则每个将转换为32字节或256位。您的帖子标题提到512位,因此看起来这些可能是单个键的两半...您尝试执行的操作有问题。

© www.soinside.com 2019 - 2024. All rights reserved.