java rsa 字符串_如何从String加载RSA公钥以在Java中进行签名验证?

本文介绍了在Java中如何从字符串加载RSA公钥进行签名验证,以及遇到的`InvalidKeyException`异常问题。提供了两种方法,包括标准库和BouncyCastle库的实现,但都遇到了解析错误。作者寻求解决方案。
摘要由CSDN通过智能技术生成

我有以下公共密钥,它以文本形式存储在数据库(Postgressql)中.这是一个字符串,在java中:

-----BEGIN RSA PUBLIC KEY-----

MIICCgKCAgEA1ht0OqZpP7d/05373OE7pB7yCVGNGzkUEuCneyfOzps6iA03NbvI

1ZL0Jpp/N3AW73lGdhaoa3X3JE4GsI/bsToVLQwTKmIOC4yjTvBctmFEoyhhTfxW

s1UHZKl4XZ/7THbRlKHhRaTKyfDAbikkMAxNT/qutLAPjnN1qOwjb1oRq52NP6FJ

KWTTikz4UeOHroX+Xthn2fJSJDlQ4YMdBbgrZVx5JcHKNuPTKRf5gI8QQKMSA9Q9

QJRE5OGp7b6dG14ZmOUnUxb00Mp20LgcaGPcuWU+oFsbQaF6W4G4bdkSZRJJXhSg

d4Q7mahpar94/gnztJmth0GzqTWUYyZIWNqIFoMwuOgeaiDV43zb3uLsRVpRKYYy

esmzcOy/jTScVLRCD8QRyu9B2wgCkNAVztQOXPCOOa4O1LlVQWaecIs4WPhOqDhi

KTBhyVkpC1TrrBkp+QMqMqWll1OyVb6k/7uV0qE/i6rHJtjo5v9bcIgYzswyx9CD

9PKl2Q0L0Jg7TMG+yLDIrLfGeuSeEc4XYJzN7bJcCeiizzu5iU9dQUkrncOrq9jn

Ub2pM/+A+JqIsoPK3IY/pJKqH4JYpGKhO1iPQF6iXIZT1r3ZgJUSQtzSeyYqhkla

2uR2BsbPbDqebCuXm3lAsY5w+dujijcn96PKwYha1LsK5sACHuJ79AMCAwEAAQ==

-----END RSA PUBLIC KEY-----

很抱歉,我不知道该密钥是如何生成的.我被告知要使用此密钥并验证另一个称为“对象”的字符串的签名.有人告诉我,我用来验证“对象”的算法是SHA256withRSA.

因此,我编写了以下java方法来读取密钥

private PublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException,InvalidKeySpecException,UnsupportedEncodingException {

publicKey = publicKey.replaceAll("\\n","");

publicKey = publicKey.replace("-----BEGIN RSA PUBLIC KEY-----","");

publicKey = publicKey.replace("-----END RSA PUBLIC KEY-----","");

publicKey = publicKey.trim();

byte[] keyDecoded = Base64.getDecoder().decode(publicKey.getBytes());

X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(keyDecoded);

KeyFactory kf = KeyFactory.getInstance("RSA");

PublicKey pubKey = kf.generatePublic(publicSpec);

return pubKey;

}

关键是我得到以下异常:

java.security.InvalidKeyException: IOException: algid parse error,not

a sequence

我已经阅读了很多关于stackoverflow的问题.其他用户编写的代码与我的代码非常相似(有时相同).所以我绝对不明白为什么它对我不起作用.其他开发人员(同事)在PHP中也做同样的事情,并且效果很好,因此我将放弃错误的公共密钥的假设.也许我不是很清楚这个过程?请问您有什么线索吗?

我还尝试使用BouncyCastle库来解决该问题,如建议的here,但我遇到了同样的异常.以下是我编写的代码:

private static PublicKey getPublicKey(String publicKey)

throws IOException,NoSuchAlgorithmException,InvalidKeySpecException {

Security.addProvider(new BouncyCastleProvider());

PemReader pp = new PemReader(new StringReader(publicKey));

PemObject pem = pp.readPemObject();

byte[] content = pem.getContent();

pp.close();

X509EncodedKeySpec spec = new X509EncodedKeySpec(content);

KeyFactory kf = KeyFactory.getInstance("RSA");

return kf.generatePublic(spec);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值