From aa538ee1d70690c21c6d08a4a6d7104983a6006c Mon Sep 17 00:00:00 2001 From: cheney Date: Tue, 12 May 2026 17:11:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AA=8C=E7=AD=BE=E5=A4=B1=E8=B4=A5=EF=BC=8C?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E6=95=B0=E6=8D=AE=E9=95=BF=E5=BA=A6=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration/crypto/pcie/Gm0018AlgorithmIds.java | 1 + .../integration/crypto/pcie/jna/EccRefPublicKey.java | 9 +++++++++ .../modules/openapi/service/impl/OpenApiService.java | 12 +++++++----- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cisd/tms/integration/crypto/pcie/Gm0018AlgorithmIds.java b/src/main/java/com/cisd/tms/integration/crypto/pcie/Gm0018AlgorithmIds.java index 4e18a5e..decdeb8 100644 --- a/src/main/java/com/cisd/tms/integration/crypto/pcie/Gm0018AlgorithmIds.java +++ b/src/main/java/com/cisd/tms/integration/crypto/pcie/Gm0018AlgorithmIds.java @@ -32,6 +32,7 @@ public final class Gm0018AlgorithmIds { public static final int RSA_ENCRYPT = 0x00010002; public static final int SM2_SIGN = 0x00020100; + public static final int SM2_SIGN_1 = 0x00020200; public static final int SM2_KEY_EXCHANGE = 0x00020200; public static final int SM2_ENCRYPT = 0x00020400; diff --git a/src/main/java/com/cisd/tms/integration/crypto/pcie/jna/EccRefPublicKey.java b/src/main/java/com/cisd/tms/integration/crypto/pcie/jna/EccRefPublicKey.java index c745d3b..4fd2e1a 100644 --- a/src/main/java/com/cisd/tms/integration/crypto/pcie/jna/EccRefPublicKey.java +++ b/src/main/java/com/cisd/tms/integration/crypto/pcie/jna/EccRefPublicKey.java @@ -27,6 +27,15 @@ public class EccRefPublicKey extends Structure { protected List getFieldOrder() { return List.of("bits", "x", "y"); } + public static byte[] fromPublicKeyToBlob(PublicKey publicKey){ + EccRefPublicKey eccRefPublicKey = EccRefPublicKey.fromPublicKey(publicKey); + return toBytes(eccRefPublicKey); + } + + private static byte[] toBytes(Structure structure) { + structure.read(); + return structure.getPointer().getByteArray(0, structure.size()); + } public static EccRefPublicKey fromPublicKey(PublicKey publicKey) { try { diff --git a/src/main/java/com/cisd/tms/modules/openapi/service/impl/OpenApiService.java b/src/main/java/com/cisd/tms/modules/openapi/service/impl/OpenApiService.java index 2f7b534..8b2ab9e 100644 --- a/src/main/java/com/cisd/tms/modules/openapi/service/impl/OpenApiService.java +++ b/src/main/java/com/cisd/tms/modules/openapi/service/impl/OpenApiService.java @@ -4,6 +4,7 @@ import com.cisd.tms.common.enums.ErrorCode; import com.cisd.tms.common.exception.BizException; import com.cisd.tms.integration.crypto.pcie.Gm0018AlgorithmIds; import com.cisd.tms.integration.crypto.pcie.PcieSessionTemplate; +import com.cisd.tms.integration.crypto.pcie.jna.EccRefPublicKey; import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult; import com.cisd.tms.integration.crypto.pcie.model.EccExternalVerifyRequest; import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest; @@ -15,6 +16,7 @@ import com.cisd.tms.modules.openapi.service.IOpenApiService; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; import java.security.cert.X509Certificate; @@ -125,9 +127,9 @@ public class OpenApiService implements IOpenApiService { log.info("找到证书: {}", cert.getSubjectDN()); - // 获取证书中的公钥 - byte[] publicKeyBytes = cert.getPublicKey().getEncoded(); - log.info("公钥数据长度: {} bytes", publicKeyBytes.length); + // 将证书中的公钥转换为 EccRefPublicKey 结构 + byte[] publicKeyBlob = EccRefPublicKey.fromPublicKeyToBlob(cert.getPublicKey()); + log.info("公钥Blob长度: {} bytes", publicKeyBlob.length); // 解码签名 byte[] sign = java.util.Base64.getDecoder().decode(signature); @@ -135,8 +137,8 @@ public class OpenApiService implements IOpenApiService { // 使用外部公钥验签 EccExternalVerifyRequest request = new EccExternalVerifyRequest(); - request.setAlgId(Gm0018AlgorithmIds.SM2_SIGN); - request.setPublicKeyBlob(publicKeyBytes); + request.setAlgId(Gm0018AlgorithmIds.SM2_SIGN_1); + request.setPublicKeyBlob(publicKeyBlob); request.setData(origBytes); request.setSignature(sign);