当前位置: 首页 > 面试题库 >

从文件加载公钥数据

闻修筠
2023-03-14
问题内容

在我的应用程序中,我生成一个公钥/私钥对,并将其存储以供以后在磁盘上使用。加载并重新初始化私钥可以正常工作,但是对于私钥,我得到了一个未知的KeySpec类型:java.security.spec.PKCS8EncodedKeySpec-
我不知道为什么。

这就是我创建和保存密钥的方式(简化了一些代码以便于阅读):

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(4096);
KeyPair keyPair = kpg.generateKeyPair();
privKey =keyPair.getPrivate();
pubKey =keyPair.getPublic();

DataOutputStream out=new DataOutputStream(ctx.openFileOutput(PRIVKEY_FILE,Context.MODE_PRIVATE));
byte[] data=privKey.getEncoded();
out.write(data);
out.close();

DataOutputStream out=new DataOutputStream(ctx.openFileOutput(PUBKEY_FILE,Context.MODE_PRIVATE));
byte[] data=pubKey.getEncoded();
out.write(data);
out.close();

下次加载私钥可以正常工作:

DataInputStream in=new DataInputStream(ctx.openFileInput(PRIVKEY_FILE));
byte[] data=new byte[in.available()];
in.readFully(data);

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data);
KeyFactory kf = KeyFactory.getInstance("RSA");
privKey = kf.generatePrivate(keySpec);

decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, privKey);

公用密钥的类似代码惨遭失败:

DataInputStream in=new DataInputStream(ctx.openFileInput(PUBKEY_FILE));
byte[] data=new byte[in.available()];
in.readFully(data);

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data);
KeyFactory kf = KeyFactory.getInstance("RSA");
pubKey = kf.generatePublic(keySpec); --> here the exception is thrown

encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, pubKey);

那我在做什么错?从磁盘加载公共密钥数据的正确方法是什么?

谢谢!


问题答案:

公钥和私钥的编码方式不同。私钥在PKCS#8中编码,而公钥则没有。相反,它们根据ASN.1规范在X.509中编码。

Key.getFormat()方法的描述:

返回此密钥的主要编码格式的名称;如果此密钥不支持编码,则返回null。如果存在针对此密钥的ASN.1规范,则根据适当的ASN.1数据格式来命名主要编码格式。例如,公共密钥的ASN.1数据格式的名称是X.509标准定义的SubjectPublicKeyInfo。在这种情况下,返回的格式为“
X.509”。同样,私钥的ASN.1数据格式的名称是PrivateKeyInfo,如PKCS#8标准所定义;在这种情况下,返回的格式为“
PKCS#8”。

据此,您应该将其读取为X.509,而不是将其作为PKCS#8读取。

考虑从以下位置更改您的公共密钥读取代码:

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data);

至:

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(data);


 类似资料:
  • 问题内容: 我用以下方法生成了一个私钥: 在此之后,我生成了一个公共密钥: 我想使用私钥对某些消息进行签名,并使用诸如此类的代码对其他私钥进行验证: 我找到了一种将私钥转换为PKCS8格式并加载它的解决方案。它可以与以下代码一起工作: 最后,我的问题是:如何从文件加载RSA公钥? 我认为也许我需要将我的公共密钥文件转换为x509格式,然后使用。但是我该怎么办呢? 问题答案: 下面是从相关信息的链接

  • 我已生成一个私钥,其中包含: 在此之后,我生成了一个公钥: 我想使用我的私钥对一些消息进行签名,并使用我的公钥验证一些其他消息,代码如下: 我找到了一个将私钥转换为PKCS8格式并加载的解决方案。它适用于以下代码: 最后我的问题是:如何从文件中加载RSA公钥? 我想可能需要将公钥文件转换为x509格式,并使用。但是我该怎么做呢?

  • 下面是我正在使用的代码 只要用要加密的文本调用'rsa'方法,就完成了。

  • 问题内容: 我正在为SAML 1.1断言消费者服务开发测试工具。测试必须生成签名的SAMLResponse,并将其提交给以Base64编码的ACS。ACS必须能够使用X509公共证书来验证签名的消息。 我能够构建SAMLResponse,添加必要的断言等。但是,当我尝试对对象进行签名时,我遇到了问题。这是我当前代码的一个片段: 错误发生在倒数第二行。我在控制台中看到以下内容: 尽管不是常规或安全的

  • 问题内容: 我正在尝试从java中的文件加载私钥。该密钥由ssh-agent生成。我实际上正在使用以下代码: 但是它产生了这个异常: 这是私钥: 有什么建议?谢谢。 问题答案: 您确定它是RSA吗?您还确定密钥的格式正确吗? 如果两个问题的答案都是肯定的,则可以尝试使用bouncycastle lib 编辑: 尝试从密钥中删除这些行: 更新:请 确保您的私钥为PKCS8格式,如果不需要,请按此处进

  • 试图通过OSX Yosomite 10.10.2上的命令行加密文本消息 创建公共如下键: 如果我试图加密myMessage.txt 我得到 如果我随后键入: 返回: 但是我不知道如何修理它。我应该改变什么才能让它发挥作用?