Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用KeyStore-Java存储自己制作的密钥_Java_Rsa_Keystore - Fatal编程技术网

使用KeyStore-Java存储自己制作的密钥

使用KeyStore-Java存储自己制作的密钥,java,rsa,keystore,Java,Rsa,Keystore,我有一个基于Clifford Cocks基本技术的简单RSA算法。我已经完成了所有工作,但我需要将私钥和公钥存储在密钥库中,以便服务器和客户端可以使用密钥共享文件 我做了一些研究,发现了“keytool”命令,但它使用RSA或DES为您创建密钥,我不知道如何使用它存储我自己的密钥。有没有办法解决这个问题 或者,如何使用KeyStore类解决这个问题 谢谢 PD:密钥现在存储在大整数中。但我认为这并不重要。听起来您已经开发了自己的RSA算法实现,并且拥有自己的私钥和公钥类。我将假设这是出于教育目的

我有一个基于Clifford Cocks基本技术的简单RSA算法。我已经完成了所有工作,但我需要将私钥和公钥存储在密钥库中,以便服务器和客户端可以使用密钥共享文件

我做了一些研究,发现了“keytool”命令,但它使用RSA或DES为您创建密钥,我不知道如何使用它存储我自己的密钥。有没有办法解决这个问题

或者,如何使用KeyStore类解决这个问题

谢谢


PD:密钥现在存储在大整数中。但我认为这并不重要。

听起来您已经开发了自己的RSA算法实现,并且拥有自己的私钥和公钥类。我将假设这是出于教育目的,并避免对使用现有实现的咆哮

但是,要使用现有的
密钥库
提供程序,您需要将密钥转换为该提供程序所需的存储格式。一旦从密钥存储中检索回密钥,就需要执行反向转换,将其转换回您自己的私钥/公钥类

对我来说,要想获得将密钥推入
密钥库
对象所带来的最小好处,这似乎需要付出巨大的努力。我建议您考虑使用序列化数据来制作自己的简单存储方案。

< P>根据公钥和私钥与“正常”RSA密钥没有区别。因此,您可以使用与容器相同的
RSAPublicKey
rsaprovatecrtkey
。问题在于,
密钥库
实现非常有限(pkcs#12、jks、jceks)-它们不能用于存储单个私钥。您需要为公钥创建一个证书链。这可能是一个自签名证书,但仅存储密钥就相当麻烦

您还可以创建自己的
密钥库
实现,但这似乎是一项巨大的工作。在您自己的提供程序中实现
keystrespi
稍微不那么复杂,但它要求您的提供程序使用一个私钥和一个由Oracle签名的证书进行签名

基本上,我会使用上面解释的自签名证书技巧或Duncan提出的序列化方案


对于非信徒:

Exception in thread "main" java.lang.IllegalArgumentException: invalid zero-length input chain
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:393)
线程“main”java.lang.IllegalArgumentException中的异常:无效的零长度输入链 位于java.security.KeyStore$PrivateKeyEntry。(KeyStore.java:393) 及

线程“main”java.lang.NullPointerException中的异常:无效的空输入 位于java.security.KeyStore$PrivateKeyEntry。(KeyStore.java:390)
可能重复@Drunix如果这是一个普通私钥,它将是一个重复。现在没有那么多了。@owlstead:至少链接文章中接受的答案显示了如果您将密钥指定为模,将指数指定为大整数,那么如何在不使用密钥库的情况下存储公钥。对于私钥也可以做同样的事情。因此,如果我们不称之为完美的复制品,那里的答案可能非常有用。此外,它们还演示了如何使用Keyspec将作为组件提供的键转换为键。因此,如果OP真的想使用密钥库,这可能会有所帮助(保留从公钥创建证书的问题)。@Drunix同意,请在此处留下评论。我的问题是,应该可以通过搜索找到带有答案的问题。在这种情况下,这将是困难的(即使在这种情况下的主题是相当模糊)。所以我完全赞成指出另一个问题,但不赞成结束这个问题。你做得怎么样?请不要放弃问题;如果您不能存储私钥,那么KeyStore.Entry.PrivateKeyEntry的具体用途是什么?你当然可以。甚至还提供了示例。@EJP“这种类型的条目持有加密私钥,可以选择以受保护的格式存储,以防止未经授权的访问。它还附带相应公钥的证书链。”@EJP基本上当前的密钥库类及其实现只针对基于X5.09的PKI。甚至Sun的PKCS#11提供商也是如此。一直有人在谈论如何扩展这些类,但是说实施
Exception in thread "main" java.lang.NullPointerException: invalid null input
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:390)