如何将字符串转换为公钥?

22

我用以下代码将公钥和私钥转换为字符串

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048);
KeyPair          keyPair    = keyPairGen.genKeyPair();
PublicKey        publicKey  = keyPair.getPublic();
PrivateKey       privateKey = keyPair.getPrivate();
String publicK = Base64.encodeBase64String(publicKey.getEncoded());
String privateK = Base64.encodeBase64String(privateKey.getEncoded());

现在我正在尝试将其转换回公钥和私钥

PublicKey publicDecoded = Base64.decodeBase64(publicK);

我遇到了“无法将byte[]转换为公钥”的错误。所以我尝试了这样做:

PublicKey publicDecoded = new SecretKeySpec(Base64.decodeBase64(publicK),"RSA");

这会导致以下错误:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: Neither a public nor a private key

看起来我在这里进行了错误的键转换。任何帮助将不胜感激。


可能是从磁盘加载存储的RSA公钥/私钥?的重复问题。 - Artjom B.
1
可能是重复的问题:将字符串转换为加密密钥,反之亦然java - Sufiyan Ghori
谢谢大家。现在我能够成功地使用X509EncodedKeySpec将其转换回PublicKey了。在发布问题之前,我进行了搜索,但我看到的大多数都涉及SecretKey的转换,而不是公钥和私钥的转换。 - The Coder
1个回答

50

我认为你不能使用SecretKeySpec与RSA。

这样应该可以:

byte[] publicBytes = Base64.decodeBase64(publicK);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);

为了解码私有使用PKCS8EncodedKeySpec


1
谢谢。我忘记了私钥。我将使用PKCS8EncodedKeySpec作为私钥。 - The Coder
7
上面的Base64是哪个import导入的? - Hooli
6
我认为这是来自org.apache.commons.codec.binary.Base64。如果您使用Java 1.8,您也可以在java.util中使用Base64.getDecoder().decode(publicK)。 - gybandi
4
我正在尝试做相同的事情,但是在执行最后一行时遇到了java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException错误。... keyfactory.generatePublic(keySpec) - Haya Raed
@HayaRaed,提出一个新问题,你会得到更多的关注。 - weston
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接