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