826220679@qq.com
2025-08-07 4d6cd980c5c69e4d9d150669c89734642297e0cd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package authorizationCode;
 
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Base64;
 
public class LicenseGenerator {
 
    
    /**
     * Éú³ÉÊÚȨÂ루ʹÓÃ×Ô¶¨ÒåÃÜÔ¿£©
     * @param base64SecretKey ×Ô¶¨ÒåBase64ÃÜÔ¿
     * @param machineCode É豸»úÆ÷Âë
     * @param expiryDate ÊÚȨ½ØÖ¹ÈÕÆÚ (¸ñʽ: YYYY-MM-DD)
     * @return Base64±àÂëµÄÊÚȨÂë×Ö·û´®
     */
    public static String generateLicenseKey(String base64SecretKey, String machineCode, String expiryDate) throws Exception {
        // ÑéÖ¤ÈÕÆÚ¸ñʽ
        validateDate(expiryDate);
        
        // Éú³ÉÊÚȨÊý¾Ý
        String licenseData = machineCode + "|" + expiryDate;
        
        // ¼ÓÃÜÊÚȨÊý¾Ý
        byte[] encryptedData = encrypt(licenseData, base64SecretKey);
        return Base64.getEncoder().encodeToString(encryptedData);
    }
 
    /**
     * ÑéÖ¤ÈÕÆÚ¸ñʽÊÇ·ñÕýÈ·
     */
    private static void validateDate(String date) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setLenient(false); // Ñϸñģʽ
        sdf.parse(date); // Èç¹ûÈÕÆÚÎÞЧ»áÅ׳öÒì³£
    }
 
   
    private static byte[] getSecretKeyBytes(String base64SecretKey) {
        // É¾³ý¿ÉÄܵĿոñ»ò»»Ðзû
        String cleanKey = base64SecretKey.replaceAll("\\s+", "");
        
        try {
            return Base64.getDecoder().decode(cleanKey);
        } catch (IllegalArgumentException e) {
            // ¸üÏêϸµÄ´íÎóÐÅÏ¢
            throw new IllegalArgumentException("Base64ÃÜÔ¿¸ñʽ´íÎó: " + cleanKey + 
                                              "¡£ÇëÈ·±£ÊäÈëÓÐЧµÄBase64±àÂëÃÜÔ¿¡£", e);
        }
    }
 
 
    /**
     * AES¼ÓÃÜ£¨Ê¹ÓÃ×Ô¶¨ÒåÃÜÔ¿£©
     */
    private static byte[] encrypt(String data, String base64SecretKey) throws Exception {
        byte[] keyBytes = getSecretKeyBytes(base64SecretKey);
        
        // ÑéÖ¤ÃÜÔ¿³¤¶È£¨AESÐèÒª16, 24»ò32×Ö½ÚµÄÃÜÔ¿£©
        if (keyBytes.length != 16 && keyBytes.length != 24 && keyBytes.length != 32) {
            throw new IllegalArgumentException("ÎÞЧµÄÃÜÔ¿³¤¶È: " + keyBytes.length + " ×Ö½Ú. " +
                                              "AESÃÜÔ¿±ØÐëÊÇ16, 24»ò32×Ö½Ú(128, 192»ò256λ).");
        }
        
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
        
        // Ê¹ÓÃÍêÕûµÄËã·¨¹æ·¶
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        
        return cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
    }
}