Java 序列化和反序列化RSA公钥

Java 序列化和反序列化RSA公钥,java,Java,我只想从字节[]创建公钥 我已经尝试过这个实验: KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(1024); KeyPair kp = kpg.genKeyPair(); Key publicKey = kp.getPublic(); Key privateKey = kp.getPrivate(); 但使用该密钥解密失败 我还尝试使用ObjectOutputStream序列化密钥,但序列化

我只想从
字节[]
创建公钥

我已经尝试过这个实验:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.genKeyPair();
Key publicKey = kp.getPublic();
Key privateKey = kp.getPrivate();
但使用该密钥解密失败

我还尝试使用
ObjectOutputStream
序列化密钥,但序列化失败

java.io.NotSerializableException:org.apache.harmony.xnet.provider.jsse.OpenSSLKey

我读到我不能将
SecretKeySpec
用于RSA

因此,只要您谈论的是SecretKey,而不是RSA或DSA密钥,那么您就不必经历涉及KeyGenerator之类的任何扭曲


任何人都知道如何执行这些扭曲或执行这些扭曲的方法。

我使用以下代码将
PubliKey
转换为PEM Base64格式

publicKey = new SecretKeySpec(publicKey.getEncoded(), publicKey.getAlgorithm());

我希望它能有所帮助。

像RSA那样的非对称密钥通常以X509格式存储。因此,您可以使用
X509EncodedKeySpec

Java 7 JavaDoc中已经有一个简单的示例(只需将DSA替换为RSA):


如果需要从
字节[]
反序列化私有文件,我发现必须使用
PKCS8EncodedKeySpec

取决于您希望对序列化表示执行什么操作。如果消费者不是别人,而是您自己的程序,请自由地推出您自己的实现。公开RSA密钥由两个整数组成-指数和模。模数很大-大约1024位,指数通常在17位左右。如果将公钥对象强制转换为
RSAPublicKey
,则这两个对象都可以作为
biginger
对象使用

因此,总结一下:

X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);
这足以恢复密钥。要反序列化:

RSAPublicKey publicKey = (RSAPublicKey)kp.getPublic();
return publicKey.getModulus().toString() + "|" +
    publicKey.getPublicExponent().toString();

如果需要将密钥传递给第三方软件,最好将其序列化为标准格式-PEM或DER。

Nice选项有助于了解发生了什么,但是
getEncoded()
和用于反序列化的
X509EncodedKeySpec
对我来说就足够了。对于RSA,有@tuxayo是的,这已经在下面的答案中了。在哪里?我只看到提到PKCS8EncodedKeySpec。无论如何,我无法使RSAPrivateKeySpec工作,最终使用了PKCS8EncodedKeySpec。我是否应该删除我的第一条可能会产生误导的评论?@tuxayo抱歉,我被
RSAPublicKeySpec
搞混了,您如何从字节数组还原原始密钥?
RSAPublicKey publicKey = (RSAPublicKey)kp.getPublic();
return publicKey.getModulus().toString() + "|" +
    publicKey.getPublicExponent().toString();
String []Parts = MyKeyString.split("\\|");
RSAPublicKeySpec Spec = new RSAPublicKeySpec(
        new BigInteger(Parts[0]),
        new BigInteger(Parts[1]));
return KeyFactory.getInstance("RSA").generatePublic(Spec);