From 7c080352b0f763b422f939c4a320f8f9a6a26442 Mon Sep 17 00:00:00 2001
From: heheng <heheng@123456>
Date: 星期四, 23 一月 2025 16:52:38 +0800
Subject: [PATCH] sign签名

---
 exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java        |   34 +++++++++++
 exam-system/pom.xml                                                |    6 ++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java |   30 ++++++++++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java     |   82 +++++++++++++++++++++++++++
 4 files changed, 152 insertions(+), 0 deletions(-)

diff --git a/exam-system/pom.xml b/exam-system/pom.xml
index 505b850..713a313 100644
--- a/exam-system/pom.xml
+++ b/exam-system/pom.xml
@@ -38,6 +38,12 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>2.1.3</version> <!-- 请检查最新版本 -->
+        </dependency>
+
     </dependencies>
 
 </project>
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java
new file mode 100644
index 0000000..2a96c2a
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/Sign.java
@@ -0,0 +1,34 @@
+package com.gkhy.exam.pay.utils;
+
+
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
+public class Sign {
+
+    private SignCommond signCommond;
+
+    public Sign() {
+        this.signCommond = new SignCommond();
+    }
+
+    public Element getSignature(String plain) {
+        SignDto signDto = this.signCommond.signSm3Detach(plain);
+        Document document = DocumentHelper.createDocument();
+        Element signature = document.addElement("Signature");
+        signature.addElement("id", "InvoicingParty");
+        Element signedInfo = signature.addElement("SignedInfo");
+        signedInfo.addElement("Reference").addAttribute("URI", "/EInvoice/Headerl/EInvoice/EInvoiceData");
+        signedInfo.addElement("SignatureAlgorithm").setText(signDto.getSignatureAlgorithm());
+        signedInfo.addElement("SignatureFormat").setText(signDto.getSignatureFormat());
+        signature.addElement("SignatureTime").setText(signDto.getSignatureTime());
+        signature.addElement("SignatureValue").setText(signDto.getSignatureValue());
+        Element keyInfo = signature.addElement("KeyInfo");
+        keyInfo.addElement("SerialNumber").setText(signDto.getSerialNumber());
+        keyInfo.addElement("X509IssuerName").setText(signDto.getIssuerDn());
+        return signature;
+
+    }
+
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java
new file mode 100644
index 0000000..a5fd109
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignCommond.java
@@ -0,0 +1,30 @@
+package com.gkhy.exam.pay.utils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.Date;
+
+public class SignCommond {
+
+    public SignDto signSm3Detach(String plain) {
+
+        try {
+            // 使用 SM3 算法生成摘要
+            MessageDigest md = MessageDigest.getInstance("SM3");
+            byte[] hashBytes = md.digest(plain.getBytes());
+
+            // 将摘要转换为 Base64 编码的字符串
+            String signatureValue = Base64.getEncoder().encodeToString(hashBytes);
+
+            SignDto signDto = new SignDto("SM3", "Base64", new Date(), signatureValue, "1234567890", "issuerDn");
+
+            return signDto;
+
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java
new file mode 100644
index 0000000..a61014e
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java
@@ -0,0 +1,82 @@
+package com.gkhy.exam.pay.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+public class SignDto {
+    private String signatureAlgorithm;
+    private String signatureFormat;
+    private String signatureTime;
+    private String signatureValue;
+    private String serialNumber;
+    private String issuerDn;
+
+    private static final String UTC_DATE_TIME = "dd MM yyyy HH:mm:ss z";
+
+
+    public static String formatWithTime(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat(UTC_DATE_TIME, Locale.CHINA);
+        sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+        return sdf.format(date);
+    }
+
+    public SignDto(String signatureAlgorithm, String signatureFormat, Date signatureTime, String signatureValue, String serialNumber, String issuerDn) {
+        this.signatureAlgorithm = signatureAlgorithm;
+        this.signatureFormat = signatureFormat;
+        this.signatureTime = formatWithTime(signatureTime);
+        this.signatureValue = signatureValue;
+        this.serialNumber = serialNumber;
+        this.issuerDn = issuerDn;
+    }
+
+    // Getters and Setters
+    public String getSignatureAlgorithm() {
+        return signatureAlgorithm;
+    }
+
+    public void setSignatureAlgorithm(String signatureAlgorithm) {
+        this.signatureAlgorithm = signatureAlgorithm;
+    }
+
+    public String getSignatureFormat() {
+        return signatureFormat;
+    }
+
+    public void setSignatureFormat(String signatureFormat) {
+        this.signatureFormat = signatureFormat;
+    }
+
+    public String getSignatureTime() {
+        return signatureTime;
+    }
+
+    public void setSignatureTime(String signatureTime) {
+        this.signatureTime = signatureTime;
+    }
+
+    public String getSignatureValue() {
+        return signatureValue;
+    }
+
+    public void setSignatureValue(String signatureValue) {
+        this.signatureValue = signatureValue;
+    }
+
+    public String getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(String serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
+    public String getIssuerDn() {
+        return issuerDn;
+    }
+
+    public void setIssuerDn(String issuerDn) {
+        this.issuerDn = issuerDn;
+    }
+}

--
Gitblit v1.9.2