algorithm identifier in public key not recognised: 1.2.156.10197.1.301如何解决
时间: 2024-05-17 21:13:24 浏览: 100
该错误通常表示Bouncy Castle库不支持该算法标识符。在这种情况下,您可以尝试更新Bouncy Castle库版本,或使用其他支持该算法的库。
如果您不想更改库,请检查公钥是否正确。如果公钥正确,则您可以尝试手动解析公钥并获取所需信息,而不是使用Bouncy Castle库中的默认方法。以下是一个示例代码,用于手动解析SM2公钥:
```
import java.io.BufferedReader;
import java.io.FileReader;
import java.math.BigInteger;
import java.security.Security;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DERBitString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class SM2PublicKeyReader {
public static void main(String[] args) throws Exception {
// 添加Bouncy Castle提供程序
Security.addProvider(new BouncyCastleProvider());
// 读取PEM文件
String pemFile = "sm2_public_key.pem";
BufferedReader reader = new BufferedReader(new FileReader(pemFile));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
if (line.startsWith("-----BEGIN PUBLIC KEY-----")) {
continue;
}
if (line.startsWith("-----END PUBLIC KEY-----")) {
break;
}
sb.append(line.trim());
}
byte[] derContent = java.util.Base64.getDecoder().decode(sb.toString());
// 解析DER编码
ASN1Sequence publicKeyInfo = ASN1Sequence.getInstance(derContent);
ASN1Sequence algorithmIdentifier = ASN1Sequence.getInstance(publicKeyInfo.getObjectAt(0));
ASN1ObjectIdentifier algorithm = ASN1ObjectIdentifier.getInstance(algorithmIdentifier.getObjectAt(0));
ASN1Integer publicKeyX = ASN1Integer.getInstance(publicKeyInfo.getObjectAt(1));
ASN1Integer publicKeyY = ASN1Integer.getInstance(publicKeyInfo.getObjectAt(2));
// 获取公钥参数
ECDomainParameters ecDomainParameters = ECDomainParameters.getByOID(algorithm);
BigInteger x = publicKeyX.getValue();
BigInteger y = publicKeyY.getValue();
ECPublicKeyParameters ecPublicKeyParameters = new ECPublicKeyParameters(ecDomainParameters.getCurve().createPoint(x, y), ecDomainParameters);
// 获取公钥
byte[] publicKeyBytes = ecPublicKeyParameters.getQ().getEncoded(true);
String publicKeyBase64 = java.util.Base64.getEncoder().encodeToString(publicKeyBytes);
System.out.println("Public key in base64: " + publicKeyBase64);
}
}
```
请注意,此代码仅适用于SM2公钥,并且假定PEM文件中只包含一个公钥。如果PEM文件中包含多个公钥或其他类型的密钥,则需要根据具体情况进行调整。
阅读全文