java解析SM2算法pem格式公钥时报错:algorithm indentifier in public key not recognised: 1.2.156.10197.1.301
时间: 2024-02-21 22:01:43 浏览: 26
这个问题通常是由于缺少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项目中。