我有一个基于Clifford Cocks基本技术的简单RSA算法。我已经完成了所有工作,但我需要将我的私钥和公钥存储在KeyStore中,以便服务器和客户端可以使用密钥共享文件。
我做了一些研究,我发现了'keytool'这个命令,但它为你创建了使用RSA或DES的密钥,而且我不知道如何使用它来存储我自己的密钥。有没有办法解决这个问题?
或者如何使用KeyStore类解决这个问题?
感谢。
PD:密钥现在存储在BigIntegers中。但我认为这不重要。
答案 0 :(得分:1)
听起来您已经开发了自己的RSA算法实现并拥有自己的私钥和公钥类。我将假设这是出于教育目的而避免使用现有实现的咆哮。
但是,要使用现有的KeyStore
提供程序,您需要将密钥转换为该提供程序所需的格式以进行存储。从密钥库中检索密钥后,您需要执行反向转换回您自己的私钥/公钥类。
对我而言,将密钥推入KeyStore
对象的最小好处似乎是一项非常艰巨的工作。我建议你考虑使用序列化数据制作自己的简单存储方案。
答案 1 :(得分:1)
根据this article,公钥和私钥与" normal"没有什么不同。 RSA密钥。因此,您可以使用相同的RSAPublicKey
和RSAPrivateCrtKey
作为容器。问题是KeyStore
实现非常有限(pkcs#12,jks,jceks) - 它们不能用于存储单个私钥。您需要为公钥创建证书链。这可能是一个自签名证书,但存储密钥非常麻烦。
你也可以创建自己的KeyStore
实现,但这似乎是一大堆工作。在您自己的提供商中实施KeyStoreSpi
稍微复杂一点,但它要求您的提供商使用私钥和Oracle签署的证书进行签名。
基本上我会使用上面解释的自签名证书技巧或Duncan提出的序列化方案。
非信徒:
Exception in thread "main" java.lang.IllegalArgumentException: invalid zero-length input chain
at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:393)
和
Exception in thread "main" java.lang.NullPointerException: invalid null input
at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:390)