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)); } }