如何使用解析出pem中的公钥信息
时间: 2023-12-01 13:02:44 浏览: 63
在 OpenSSL 中,可以使用以下命令从 PEM 格式的公钥文件中提取出公钥信息:
```
openssl ec -pubin -in publickey.pem -text -noout
```
其中,publickey.pem 是 PEM 格式的公钥文件的路径。执行以上命令后,会输出公钥的信息,包括算法标识、公钥点坐标等,示例如下:
```
read EC key
Public-Key: (256 bit)
pub:
04:a9:5d:3f:23:4f:3e:ee:ed:12:8c:25:23:98:67:
7f:6a:6e:9f:53:26:07:16:7e:da:3e:4a:1c:ee:cb:
7c:06:d8:1c:2e:5c:5b:e9:6c:dd:84:5a:86:1d:1c:
44:dc:6e:1a:af:2c:6b:56:65:4c:b5:9e:6e:3e:8a:
3d:db:2d:22:95
ASN1 OID: sm2
```
其中,pub 字段后面的值就是公钥的十六进制编码。需要将这个编码转换成字节数组,然后进行解析得到公钥的各个部分。SM2 的公钥部分由两个坐标值组成,可以将公钥编码解析成两个 BigInteger 对象,分别表示 x 和 y 坐标值。
相关问题
java解析SM2算法pem格式公钥时报错:algorithm indentifier in public key not recognised: 1.2.156.10197.1.301
这个问题通常是由于缺少SM2算法支持所引起的。要解决这个问题,你需要确保你的Java程序中包含了支持SM2算法的库。你可以使用Bouncy Castle作为Java的加密扩展库,它支持SM2算法,并且提供了解析SM2算法pem格式公钥的方法。
以下是一个使用Bouncy Castle库解析SM2算法pem格式公钥的例子:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.security.Security;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
public class SM2PublicKeyParser {
public static void main(String[] args) throws IOException {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
String pemPublicKey = "-----BEGIN PUBLIC KEY-----\n" +
"MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeHTw1h2kOJ5/SrCvLhMn6QNvqJi\n" +
"VX8Rv8/4G4YjyjYyKSZqWhhJ7KJxGJz+Z1D6OPZvVfR9ffzOcJXw5S0wCgYIKoE\n" +
"cz1UBg3UDQQAIWxK0cX1S7uQqEKWfW9d3LsB2bvVvXG5d3VjPfDQ8PILZVETL9+\n" +
"gQwW7hV8q/mdE5QWQwVS3Fg=\n" +
"-----END PUBLIC KEY-----";
BufferedReader pemReader = new BufferedReader(new StringReader(pemPublicKey));
PEMParser pemParser = new PEMParser(pemReader);
Object object = pemParser.readObject();
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
SubjectPublicKeyInfo publicKeyInfo = null;
if (object instanceof SubjectPublicKeyInfo) {
publicKeyInfo = (SubjectPublicKeyInfo) object;
} else if (object instanceof PEMKeyPair) {
publicKeyInfo = ((PEMKeyPair) object).getPublicKeyInfo();
}
if (publicKeyInfo != null) {
System.out.println("Parsed public key: " + converter.getPublicKey(publicKeyInfo));
} else {
System.out.println("Failed to parse public key.");
}
}
}
```
在上面的代码中,我们使用了Bouncy Castle库的PEMParser类来解析pem格式公钥,然后使用JcaPEMKeyConverter类将SubjectPublicKeyInfo对象转换为Java的PublicKey对象。在运行代码之前,确保你已经将Bouncy Castle库添加到你的Java项目中。
java如何解析sm2的pem文件获取公钥
Java中可以使用Bouncy Castle库来解析SM2的PEM文件获取公钥。下面是一个简单的示例代码:
```java
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import java.io.FileReader;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
public class SM2PEMParserExample {
public static void main(String[] args) {
try (FileReader reader = new FileReader("public_key.pem")) {
PEMParser parser = new PEMParser(reader);
SubjectPublicKeyInfo subjectPublicKeyInfo = (SubjectPublicKeyInfo) parser.readObject();
JcaPEMKeyConverter pemConverter = new JcaPEMKeyConverter();
PublicKey publicKey = pemConverter.getPublicKey(subjectPublicKeyInfo);
System.out.println(publicKey);
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
以上代码将解析名为"public_key.pem"的PEM文件,并将其转换为公钥对象。如果你需要解析私钥,可以将`SubjectPublicKeyInfo`换成`PEMEncryptedKeyPair`并使用`JcaPEMKeyConverter#getKeyPair`方法来获取私钥和公钥对。
需要注意的是,Bouncy Castle库需要单独引入,你可以在项目中添加以下maven依赖来引入Bouncy Castle库:
```xml
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.68</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
```
阅读全文