【发布时间】:2019-12-10 08:39:49
【问题描述】:
我已经创建了公钥和私钥。 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 编码”公钥?因为没有像 PKCS#8 编码的公钥这样的; PKCS#8 仅用于私钥/密钥(实际上,the standard 的标题是“私钥信息语法规范版本 1.2”)。所以这是另一个 PHP 决定“做点什么”而不是简单地失败的例子,因为代码是不正确的。
-
@Maarten-reinstateMonica - 在这种情况下,PKCS#8 指的是使用以下 ASN.1 格式的密钥:pastebin.com/4Gy0p9Qw 当然,PKCS#8 可能不是最好的描述,但不知道会是什么。这些键以
-----BEGIN PUBLIC KEY-----开头。这与 Xihar 的库所指的 PKCS#1 密钥形成对比,后者以-----BEGIN RSA PUBLIC KEY-----或-----BEGIN EC PUBLIC KEY-----或其他开头。我明白了 - PKCS#1 只谈论 RSA 而不是 EC 公钥,但你还要怎么称呼它? -
@Maarten-reinstateMonica - none-the-less, pastebin.com/c03kGJjh 是 OP (Xihar) 正在谈论的格式中的一个关键。
-
@neubert 最后一个是称为
SubjectPublicKeyInfo的结构,它是X.509 证书格式的一部分(因此在Java 中为X509EncodedKeySpec)。 -
@Maarten-reinstateMonica - 最佳名称的构成有点主观。对于私钥,PKCS#8 最终是一种包装格式,其中包含算法特定信息作为需要单独解码的八位字节字符串。从精神上讲,这与 Java 的
X509EncodedKeySpec相同,在某些方面我觉得它可能是一个更好的名字,因为X509EncodedKeySpec可能会在不应该的时候让人联想到整个 X.509 规范的图像。
标签: java php cryptography rsa phpseclib