diff --git a/device-fingerprint-tool/src/main/java/com/sunyard/cisd/Main.java b/device-fingerprint-tool/src/main/java/com/sunyard/cisd/Main.java index 39d89cb..34162d3 100644 --- a/device-fingerprint-tool/src/main/java/com/sunyard/cisd/Main.java +++ b/device-fingerprint-tool/src/main/java/com/sunyard/cisd/Main.java @@ -1,17 +1,71 @@ package com.sunyard.cisd; +import java.nio.charset.StandardCharsets; +import java.security.PublicKey; +import java.util.Base64; + public class Main { + + private static final String DEVICE_DIR = "/home/tms/device"; + private static final String SIGN_FILE = DEVICE_DIR + "/dev.sign"; + private static final String SIGN_SM3_FILE = DEVICE_DIR + "/dev.sign.sm3"; + private static final String PUBLIC_KEY_FILE = DEVICE_DIR + "/dev.fingerprint.pub"; + private static final String PUBLIC_KEY_SM3_FILE = DEVICE_DIR + "/dev.fingerprint.pub.sm3"; + private static final String PRIVATE_KEY_PATH = "/sm2_private_key.pem"; + public static void main(String[] args) { - DeviceFingerprintService service = new DeviceFingerprintService(); - DeviceFingerprint fingerprint = service.getDeviceFingerprint(); - - System.out.println("=== 设备指纹信息 ==="); - System.out.println("主板序列号: " + fingerprint.getMotherboardSerialNumber()); - System.out.println("设备序列号: " + fingerprint.getDeviceSerialNumber()); - System.out.println("CPU型号: " + fingerprint.getCpuModel()); - System.out.println("CPU序列号: " + fingerprint.getCpuSerialNumber()); - System.out.println("内存大小: " + fingerprint.getMemorySize()); - System.out.println("首块网卡MAC地址: " + fingerprint.getFirstNetworkMacAddress()); - System.out.println("硬盘序列号: " + fingerprint.getHardDiskSerialNumber()); + try { + DeviceFingerprintService service = new DeviceFingerprintService(); + DeviceFingerprint fingerprint = service.getDeviceFingerprint(); + + System.out.println("=== 设备指纹信息 ==="); + System.out.println("主板序列号: " + fingerprint.getMotherboardSerialNumber()); + System.out.println("设备序列号: " + fingerprint.getDeviceSerialNumber()); + System.out.println("CPU型号: " + fingerprint.getCpuModel()); + System.out.println("CPU序列号: " + fingerprint.getCpuSerialNumber()); + System.out.println("内存大小: " + fingerprint.getMemorySize()); + System.out.println("首块网卡MAC地址: " + fingerprint.getFirstNetworkMacAddress()); + System.out.println("硬盘序列号: " + fingerprint.getHardDiskSerialNumber()); + + String plainText = buildPlainText(fingerprint); + System.out.println("\n拼接后的原文: " + plainText); + + byte[] signature = SM2Util.sign(plainText.getBytes(StandardCharsets.UTF_8), PRIVATE_KEY_PATH); + System.out.println("签名结果(Base64): " + Base64.getEncoder().encodeToString(signature)); + + PublicKey publicKey = SM2Util.loadPublicKey("/sm2_public_key.pem"); + String publicKeyPEM = SM2Util.publicKeyToPEM(publicKey); + + SM2Util.writeFile(SIGN_FILE, signature); + System.out.println("签名文件已保存: " + SIGN_FILE); + + String signSm3 = SM2Util.sm3DigestHex(signature); + SM2Util.writeFile(SIGN_SM3_FILE, signSm3); + System.out.println("签名SM3校验值已保存: " + SIGN_SM3_FILE + " (" + signSm3 + ")"); + + SM2Util.writeFile(PUBLIC_KEY_FILE, publicKeyPEM); + System.out.println("公钥文件已保存: " + PUBLIC_KEY_FILE); + + String publicKeySm3 = SM2Util.sm3DigestHex(publicKeyPEM.getBytes(StandardCharsets.UTF_8)); + SM2Util.writeFile(PUBLIC_KEY_SM3_FILE, publicKeySm3); + System.out.println("公钥SM3校验值已保存: " + PUBLIC_KEY_SM3_FILE + " (" + publicKeySm3 + ")"); + + boolean verified = SM2Util.verify(plainText.getBytes(StandardCharsets.UTF_8), signature, publicKey); + System.out.println("\n签名验证结果: " + verified); + + } catch (Exception e) { + System.err.println("处理过程中发生错误: " + e.getMessage()); + e.printStackTrace(); + } } -} \ No newline at end of file + + private static String buildPlainText(DeviceFingerprint fingerprint) { + return fingerprint.getMotherboardSerialNumber() + + fingerprint.getDeviceSerialNumber() + + fingerprint.getCpuModel() + + fingerprint.getCpuSerialNumber() + + fingerprint.getMemorySize() + + fingerprint.getFirstNetworkMacAddress() + + fingerprint.getHardDiskSerialNumber(); + } +} diff --git a/device-fingerprint-tool/src/main/java/com/sunyard/cisd/SM2Util.java b/device-fingerprint-tool/src/main/java/com/sunyard/cisd/SM2Util.java index 0b86562..a4c2dc4 100644 --- a/device-fingerprint-tool/src/main/java/com/sunyard/cisd/SM2Util.java +++ b/device-fingerprint-tool/src/main/java/com/sunyard/cisd/SM2Util.java @@ -4,12 +4,14 @@ import org.bouncycastle.asn1.ASN1ObjectIdentifier; import org.bouncycastle.asn1.gm.GMObjectIdentifiers; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.params.ECDomainParameters; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.signers.SM2Signer; +import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.jce.ECNamedCurveTable; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECParameterSpec; @@ -17,10 +19,14 @@ import org.bouncycastle.jce.spec.ECPrivateKeySpec; import org.bouncycastle.jce.spec.ECPublicKeySpec; import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.util.BigIntegers; +import org.bouncycastle.util.encoders.Hex; import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.security.KeyFactory; @@ -153,4 +159,32 @@ public class SM2Util { pem.append("-----END PUBLIC KEY-----\n"); return pem.toString(); } + + public static byte[] sm3Digest(byte[] data) { + SM3Digest digest = new SM3Digest(); + digest.update(data, 0, data.length); + byte[] result = new byte[digest.getDigestSize()]; + digest.doFinal(result, 0); + return result; + } + + public static String sm3DigestHex(byte[] data) { + byte[] digest = sm3Digest(data); + return Hex.toHexString(digest); + } + + public static void writeFile(String filePath, byte[] content) throws Exception { + File file = new File(filePath); + File parentDir = file.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + parentDir.mkdirs(); + } + try (OutputStream os = new FileOutputStream(file)) { + os.write(content); + } + } + + public static void writeFile(String filePath, String content) throws Exception { + writeFile(filePath, content.getBytes(StandardCharsets.UTF_8)); + } } diff --git a/device-fingerprint-tool/src/main/resources/sm2_private_key.pem b/device-fingerprint-tool/src/main/resources/sm2_private_key.pem index a6f9554..c8e37f3 100644 --- a/device-fingerprint-tool/src/main/resources/sm2_private_key.pem +++ b/device-fingerprint-tool/src/main/resources/sm2_private_key.pem @@ -1,6 +1,6 @@ -----BEGIN PRIVATE KEY----- -MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg7isDlcvx8WmYYw/6 -Xc25GcgDx3N19Czq6O2tz2v5Jx+gCgYIKoEcz1UBgi2hRANCAATJMA+gouZuIttR -bqpDk/tjk4jefTgG1ncg7xuVoTVz10hFja5bbTssru4oD4Pooxz4VbTR1KIylDYo -bLe3PyUJ +MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgWFBMLowcSO3Pn8tP +KLszWBm/BSNPwSQvXErq1NiXkvqgCgYIKoEcz1UBgi2hRANCAARhkJ62bG2Gjg3h +LE5fSlyaYxjFNKEyehbFUcHQSOPwRL9pDwUD5bnqpo3jNNlVYQnaKV0khg8gKlBU +I3MM2oX4 -----END PRIVATE KEY----- diff --git a/device-fingerprint-tool/src/main/resources/sm2_public_key.pem b/device-fingerprint-tool/src/main/resources/sm2_public_key.pem index 021df1d..b40a46b 100644 --- a/device-fingerprint-tool/src/main/resources/sm2_public_key.pem +++ b/device-fingerprint-tool/src/main/resources/sm2_public_key.pem @@ -1,4 +1,4 @@ -----BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEyTAPoKLmbiLbUW6qQ5P7Y5OI3n04 -BtZ3IO8blaE1c9dIRY2uW207LK7uKA+D6KMc+FW00dSiMpQ2KGy3tz8lCQ== +MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYZCetmxtho4N4SxOX0pcmmMYxTSh +MnoWxVHB0Ejj8ES/aQ8FA+W56qaN4zTZVWEJ2ildJIYPICpQVCNzDNqF+A== -----END PUBLIC KEY-----