setPrivateKeyFormat(RSA::PRIVATE_FORMAT_PKCS8); -6ren">
gpt4 book ai didi

java - 从文件中读取公钥或私钥时如何修复 "invalid key format"?

转载 作者:行者123 更新时间:2023-12-04 14:16:56 24 4
gpt4 key购买 nike

我已经创建了公钥和私钥。 php代码生成的公钥和私钥:

<?php
require __DIR__ . '/vendor/autoload.php';
use phpseclib\Crypt\RSA;
$rsa = new RSA();
extract($rsa->createKey());
$rsa->setPrivateKeyFormat(RSA::PRIVATE_FORMAT_PKCS8);
$rsa->setPublicKeyFormat(RSA::PUBLIC_FORMAT_PKCS8);

file_put_contents("privateKey.pem",$privatekey);
file_put_contents("publicKey.pem", $publickey);

读取这些键的 java 源代码:

    import java.io.*;
import java.security.*;
import java.security.spec.*;

public class PublicKeyReader {

public static PublicKey get(String filename)
throws Exception {

File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int)f.length()];
dis.readFully(keyBytes);
dis.close();

X509EncodedKeySpec spec =
new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}

public static void main (String [] args) throws Exception {
PublicKeyReader publicKeyReader = new PublicKeyReader();
PublicKey publicKey = publicKeyReader.get("key/testPub.pem");
System.out.println(publicKey);
}
}

它产生 java.security.InvalidKeyException: invalid key format.

需要这方面的帮助。提前致谢。

最佳答案

首先,如评论中所述,不存在 PKCS#8 公钥之类的东西。这意味着 PHP 库不知道它在说什么。相反,如果 neubert 是正确的,您似乎得到的是为 X.509 证书定义的结构,称为 X509EncodedKeySpec。在 Java 代码中,您确实在尝试使用它来读取公钥。

但是,您忘记了 X509EncodedKeySpec 是一种二进制格式,在 ASN.1 DER 中指定。您收到的是使用 ASCII 装甲的 PEM 编码 key 。换句话说,二进制文件已被编码为 base64,并添加了页眉和页脚行。这样做是为了使其与邮件(隐私增强邮件或 PEM)等文本界面兼容。

所以你要做的就是卸下盔甲。您最好使用 PEM 阅读器(例如 Bouncy CaSTLe 提供的阅读器)来执行此操作。

PemReader reader = new PemReader(new FileReader("spki.pem"));
PemObject readPemObject = reader.readPemObject();
String type = readPemObject.getType();
byte[] subjectPublicKey = readPemObject.getContent();

System.out.println(type);

X509EncodedKeySpec spec = new X509EncodedKeySpec(subjectPublicKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(spec);
System.out.println(pubKey);

打印

PUBLIC KEY

其次是

Sun RSA public key, 1024 bits
params: null
modulus: 119445732379544598056145200053932732877863846799652384989588303737527328743970559883211146487286317168142202446955508902936035124709397221178664495721428029984726868375359168203283442617134197706515425366188396513684446494070223079865755643116690165578452542158755074958452695530623055205290232290667934914919
public exponent: 65537

对于怀疑论者 - hi neubert ;) - 这是来自 X.509 specification 的 SubjectPublicKeyInfo 的定义:

SubjectPublicKeyInfo  ::=  SEQUENCE  {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }

其中 subjectPublicKey 包含 PKCS#1 格式的编码公钥 - 当然是在 RSA 公钥的情况下。

here是 neubert key 的解码版本,因此您可以进行比较。 Java 中解析的键是同一个键。

关于java - 从文件中读取公钥或私钥时如何修复 "invalid key format"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59263160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com