java.security.KeyStoreException:无法存储非私有密钥

java.security.KeyStoreException:无法存储非私有密钥,java,cryptography,rsa,Java,Cryptography,Rsa,我已经生成了一对公钥和私钥,并试图将私钥存储在Java密钥库中。 但我每次都会出错 我的代码: KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair pair = keyGen.generateKeyPair(); PrivateKey priv

我已经生成了一对公钥和私钥,并试图将私钥存储在
Java密钥库
中。 但我每次都会出错

我的代码:

            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
            keyGen.initialize(2048);
            KeyPair pair = keyGen.generateKeyPair();
            PrivateKey privateKey = pair.getPrivate();
            PublicKey publicKey = pair.getPublic();
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            String ss = Base64.encodeBase64String(cipher.doFinal(ppp.getBytes("UTF-8")));
            System.out.println(ss);

            // Creating the KeyStore object
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

            // Loading the KeyStore object
            char[] ksPassword = "changeit".toCharArray();
            String path = "C:/Program Files/Java/jre1.8.0_201/lib/security/cacerts";
            java.io.FileInputStream fis = new FileInputStream(path);
            keyStore.load(fis, ksPassword);

            // Creating the KeyStore.ProtectionParameter object
            KeyStore.ProtectionParameter protectionParam = new 
            KeyStore.PasswordProtection(ksPassword);

            // Creating SecretKey object
            SecretKey mySecretKey = new SecretKeySpec(ppp.getBytes(), "RSA");

            // Creating SecretKeyEntry object
            KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
            keyStore.setEntry("mykeyalias", secretKeyEntry, protectionParam);

            // Storing the KeyStore object
            java.io.FileOutputStream fos = null;
            fos = new java.io.FileOutputStream("newKeyStoreName");
            keyStore.store(fos, ksPassword);
但我在运行时在
keyStore.setEntry
行中遇到以下异常:

java.security.KeyStoreException: Cannot store non-PrivateKeys
    at sun.security.provider.JavaKeyStore.engineSetKeyEntry(JavaKeyStore.java:261)
    at sun.security.provider.JavaKeyStore$JKS.engineSetKeyEntry(JavaKeyStore.java:56)
    at java.security.KeyStoreSpi.engineSetEntry(KeyStoreSpi.java:550)
    at sun.security.provider.KeyStoreDelegator.engineSetEntry(KeyStoreDelegator.java:179)
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineSetEntry(JavaKeyStore.java:70)
    at java.security.KeyStore.setEntry(KeyStore.java:1557)
    at com.sprint.neo.bc4j.util.TestMain.StoringKeys(TestMain.java:33)

是否有人可以帮助解决此问题,以便我可以存储java密钥库的私钥以及别名,以便以后使用。上面代码中的错误在哪里。非常感谢。

世上没有RSA
SecretKey
。见和。RSA是一种非对称(公共/私有)密钥机制,而不是对称(“秘密”)密钥机制。好吧,我明白了。然后,如果我想要
公共/私有
密钥机制,我如何实现它。您能提出建议吗?不幸的是,在密钥库中存储私钥和公钥并不是那么简单。您需要构建(自签名)证书(持有公钥)并将其与私钥一起存储在密钥库中。如果不需要密钥库,可以将编码的私钥和公钥(作为简单的字节数组)保存到文件中。对于恢复,请使用私钥和公钥的密钥规范,并使用密钥。确定:(你能看一下下面的链接吗,这和你说的完全一样吗?——我建议你用Java keytool创建一个密钥库,并使用它,而不是通过编程方式生成自签名证书。一篇文章显示了这一点,用于创建的命令行是'keytool-genkey-keyalg RSA-alias selfsigned-ke'ystore keystore.jks-storepass password-validity 360-keysize 2048'