| package com.ruoyi.authorize.common; | 
|   | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.apache.commons.codec.binary.Hex; | 
| import org.apache.commons.compress.utils.IOUtils; | 
| import java.io.*; | 
| import java.net.InetAddress; | 
| import java.net.NetworkInterface; | 
| import java.util.Base64; | 
| import java.util.Calendar; | 
| import java.util.Date; | 
| import java.util.GregorianCalendar; | 
| import java.util.Scanner; | 
| import javax.crypto.Cipher; | 
| import javax.crypto.KeyGenerator; | 
| import javax.crypto.SecretKey; | 
| import javax.crypto.SecretKeyFactory; | 
| import javax.crypto.spec.DESedeKeySpec; | 
| import javax.crypto.spec.SecretKeySpec; | 
| import javax.xml.bind.DatatypeConverter; | 
|   | 
| @Slf4j(topic="authorize") | 
| public class AuthorizeUtil { | 
|   | 
|     public static String MachineCode=""; | 
|   | 
|     private static String confusionString = "TczYTMY2MzII32MVjZjgjMzYWmQwM5z"; | 
|     private static String confusionString2 = "0ZDMwM2UxYTFmZmRZWZkMkODUxNGYzM"; | 
|     private static String confusionString3 = "MxYzY2ZDUYzN5MAOWViNWQ3YzOTRke9"; | 
|     private static String confusionString4 = "f15a5M0MjNmExNlNkNDQzWI3MTE1NTN"; | 
|   | 
|     private static String getKeyStr(String keyStr) { | 
|         return Md5Utils.hash(keyStr); | 
|     } | 
|   | 
|     public static void main(String[] args) { | 
|   | 
|         AuthorizeUtil ss = new AuthorizeUtil(); | 
|         log.debug("sysStr " + ss.parsLicense()); | 
|         log.debug("MachineCode " + ss.getMachineCode()); | 
|         log.debug("CPUCode     " + ss.getCPUCode()); | 
|         //String codeString=ss.parsLicense("b1db709f19d9769e536e2e29888e38b2"); | 
|         //System.out.println(codeString); | 
|         //ss.makeTempLicense(); | 
|         //System.out.println("get "+ss.parsLicense()); | 
|         //ss.writeFile("22"); | 
|         /* | 
|         String str = "{\"systemAuthorizeDate\":\"20190404240000\",\"meteorologicalDeviceType\":\"1,2\",\"meteorologicalDeviceNum\":\"999\",\"screenDeviceType\":\"1,2,3\",\"screenDeviceNum\":\"999\",\"captureDeviceType\":\"1,2,3,4\",\"captureDeviceNum\":\"999\"}"; | 
|                str = "{\"systemAuthorizeDate\":\"20180721015732\",\"meteorologicalDeviceType\":\"1,2\",\"meteorologicalDeviceNum\":\"10\",\"screenDeviceType\":\"1,2,3\",\"screenDeviceNum\":\"10\",\"captureDeviceType\":\"1,2,3,4\",\"captureDeviceNum\":\"10\"}"; | 
|         //System.out.println(ss.encode(key).replace("9", "QQQ999QQQ999QQQ")); | 
|         System.out.println(str);*/ | 
|         String key = ss.getMachineCode(); | 
|         String stringcodeString = "MGNiYTEwMDNhZTBmNTI2MmUzNGI1ZWNjYmFmZGY3ZDY3ZDU4MDNkMGQ2NTFkYmE4Mjc0NTZjNTQxMzMwZWNmYTkxNDJkYWNjODNiMGYyOTU3MDhlY2QzMDJhMjFjM2VjMmU0M2UyYmFhNzIzNDc5YjMzYjU0YmQzOTVmM2ZmZjE4MjZjYTZlMGQ3ZGM4MjNkY2ZiMWQ0MDkyMDk4ZTYxOTA1ZTM5ZmJkZWI2MTQwNTllNDY1YWQwYTg1OThkNWJkMDljMjRiY2Q2ZTA5NTQzYjYzNWNhNWJhZDZjYTAyMDFmMTYwNzVkNzI2MGEyMThiZDc2MTc0YjRkYjllNjdkZDRjY2ExMTgwYWFhZGU5YzlmY2Y0ZmI0N2Q5N2Q4NjNiNDYxMDAwMzQwNmE3OWM1ODc5YzVjOGYwYmIxMDQ1YjM5NWJkYTk5MjJkOWE1NTRlMDJiYWNlOTE2NmIxYmNiYTZjMTZjZjVhNzMwY2M0NzU1NDhlMGUwOTQ5NzQ4ZWJiMDU4ODcxZmQyYjk4ZWMyNWU2N2RlOWY0ZGFhZGU3MmVmZmJiMGQxNzEzNGZjODZkZmFlYjkxOTU2OTliNmMwMzJkNmU3YmZmMzIzODRmM2UyYzViZTY4NWY5NDY1YjlhODIyZjFiMGQ1NzhlODJjYmNkYzA1YWNhYTg2ODZlMzY2OGQ1ZWRlNmM5YzRiN2RhYTFjZDY0NWQ5ZGMxYmU0YTM1N2U2NDA1NDQxYmVjMWEwM2M2NTQzMTM1YjJjYzY2YjJiMmZkZjNlZWYzZTY5YTQ3YWVlNjhiZTNjMTliMmEyZGZhZWY0NDRmYWEwZDc1MDMxODEyNGE1ZjFjMDZmZGY3MTQzZGYxNDdmYjRmMDdkZTBiYThjYmJlNmFhM2Y1MTk2NTE4MjgwNjYyYzAxMWYyOTNkOWYyYzdlYzQ3Mzc1YTVjZWFiZjdjZGJhYjAxZGRkZWQ5OWUwYTJkNzE1NDBiMjU0MDlmMTQzMThkNDMzNGQyZjNhMjllNDRmYzdlZjA3ZjhhYmE2ZTJiNDZlNjcxNzJhMDJhMjJjZDE3YTZkNTE0MzI2MTkxZjkxMGUyZmE4MGE5ZTFlNjQxZDk3ZDcyZDliYTNjMDI3YjZlYzk3MDIwMDY1YTJhYjEyNTg0"; | 
|         System.out.println("ok " + ss.parsLicense(key, stringcodeString)); | 
|   | 
|         //System.out.println(ss.parsLicense("OWUzYTIxYWI4MWQxZGJlMmYxNDEyY2Y2YWU4NWQzZGFmZjZlZWUwNTMzYmY2ZWI4NWM5ZDFkZTIxMDAwODA5NDJhZGU5NDQ4NmI0MjY3ZmRhMWI0ZjYwZWIxYzU4ZjgzYjNhOTMyZjJiOTZiZjk4ZjY2Y2M0MDg0YjAyMjYwYzhlZjc2YjYwZTJiODQ4MjJmY2Y2ZWRhNTAxM2Q4Zjk0YmZkMGViYjdkYzBkMThjMjRhNDRmZWI3ZTQ2YjM4ZDQ2MjQ1YmQzOTYyYmJhYmRjYzg2Njc5NWQ4MTEyZTEyNjFjMmY3ZjQ1NDY5Y2VmOTliM2I5YzdkMmQxYjYzNWJlMzRjMzZhY2VlYTE0MjdlMjA2NWU3YWY5NGZmZjFjZGM1ODVkNzZlNDVlMmZlNjBlN2Q4ZDMwNThiMDU2MzYyMTE1OTMxYzg2Y2E1MmVjN2Y0YzhiYTBiZGNlYzQ3MjMzYWI4MWEzYzZhZDhkYjQzYTk1YTFiMGRkODJlOGYzNjQzNDE0MzNkYzNhNjA1ZjExN2Y3YTZhODcyNTA3ZTRkYjRjY2FlM2IwMDU4MTg4Y2FhMzA5YjdiN2QzOGQ2MGU3MTU5MzFjODZjYTUyZWM3ZjRjOGJhMGJkY2VjNDcyMzNhNTM3NDZlN2ZlOGFiZWM5OWY2YzhlMTg3NTc0OWEzYmM=")); | 
|         //System.out.println(ss.parsLicense()); | 
|         //System.out.println(ss.parsLicense("ZjRmYjNhYzdiY2Q1NGFjZjc0NWNiNzg1MGMzYTg2YjRzMXkybjNqNG81bjZlN3M4ZWRiN2NzMXkybjNqNG81bjZlN3M4ZmU2YXMxeTJuM2o0bzVuNmU3czg1MDI0ZDI1NDM0ODJjOGQ3N2E3NDRjM2NjYTg3ZHMxeTJuM2o0bzVuNmU3czhmYnMxeTJuM2o0bzVuNmU3czhlYmNkZTQ1czF5Mm4zajRvNW42ZTdzOGU1YjNzMXkybjNqNG81bjZlN3M4YTRkYjcyMTc1ZmZlNHMxeTJuM2o0bzVuNmU3czhzMXkybjNqNG81bjZlN3M4OGJiYWNjZDM3Y2NlZDQwMTBzMXkybjNqNG81bjZlN3M4MzJzMXkybjNqNG81bjZlN3M4ZDBhZjM3NmQ1YnMxeTJuM2o0bzVuNmU3czg1YTMwNmI4ODdkNWRjYmFjZHMxeTJuM2o0bzVuNmU3czg2YzEwZThjMTMxNjE0YTU2MzJlNjdzMXkybjNqNG81bjZlN3M4OGI3YWMwNThhMmNzMXkybjNqNG81bjZlN3M4YWRkNzAyNzU1NzBhYjVlN2M2YmVlMXMxeTJuM2o0bzVuNmU3czhiZWNiYzg3NHMxeTJuM2o0bzVuNmU3czg2ZTBmMTM1NTRhOGMxZjRlYjA0ZmJkZmM1NzU0NDMzMjBkNjRlMjQxN3MxeTJuM2o0bzVuNmU3czgwM2E0YjBlYTAwM2Y1NDNlMjhzMXkybjNqNG81bjZlN3M4YXMxeTJuM2o0bzVuNmU3czhiMWY2MTM0YWFiNDBzMXkybjNqNG81bjZlN3M4NTFiYmYxNXMxeTJuM2o0bzVuNmU3czg4NWZhYThhN3MxeTJuM2o0bzVuNmU3czgyMzIyNjQxNTc1YXMxeTJuM2o0bzVuNmU3czgzMTJkZThmM2FmNjQ4MjQwYzYxMTdhYmVzMXkybjNqNG81bjZlN3M4MjFlM3MxeTJuM2o0bzVuNmU3czhhMWVlMTQxczF5Mm4zajRvNW42ZTdzODZlZGJlNjA3YWE2OGE0MmFkNDVmMjE3NzY4NDhlMWM1ZDVkZTNjYzIxNmEyNmUwMzFkODY4czF5Mm4zajRvNW42ZTdzODZmczF5Mm4zajRvNW42ZTdzODA4NTI0YmUzczF5Mm4zajRvNW42ZTdzOGVjM2Y0NmI3czF5Mm4zajRvNW42ZTdzODYyM2ZkYjVhMTY1ZTc0MzJmczF5Mm4zajRvNW42ZTdzODFmZWY3ODc2ZTE4NjQ3ZjY4YjFzMXkybjNqNG81bjZlN3M4NmRjMTBiczF5Mm4zajRvNW42ZTdzOGU2MDE3ZDQ1MzFmZWUzczF5Mm4zajRvNW42ZTdzOGMzczF5Mm4zajRvNW42ZTdzOGNzMXkybjNqNG81bjZlN3M4YjdmODMyMjRlczF5Mm4zajRvNW42ZTdzOHMxeTJuM2o0bzVuNmU3czg2YjBmNTdjYjVkNmIzNzU3NTBkMGI3MjdmNDM2YnMxeTJuM2o0bzVuNmU3czg4ZGRjM2FhMmM2ODFlNjcwMGQ0MmExNDdmNTdhZDEyMGU4ZDFmN2FlMDFmNmE1ZmUwczF5Mm4zajRvNW42ZTdzODgzY2IwNGZiYzg4NGQzZTZkZGYyMTRmZThlZTIzZDA0ZmU4ZTNlYjBiZDBkMzhzMXkybjNqNG81bjZlN3M4NmZzMXkybjNqNG81bjZlN3M4MDg1MjRiZTNzMXkybjNqNG81bjZlN3M4ZWMzZjQ2YjdzMXkybjNqNG81bjZlN3M4NjIzZmRiNWExMGM1YTQ2YWUwNjNzMXkybjNqNG81bjZlN3M4MGNzMXkybjNqNG81bjZlN3M4Y2QyYWU4MjU4MWYwZWQ1MTc=")); | 
|   | 
|     } | 
|   | 
|     //获取到授权信息生成-加密信息返回 | 
|     public static String getLicense(String key, String str) { | 
|         String aString = str.replaceAll("Authorize", confusionString); | 
|         String bString = encodeAES(getKeyStr(key), aString); | 
|         String cString = encode64(bString).replaceAll("==", confusionString3).replaceAll("=", confusionString4).replaceAll("4M", confusionString2); | 
|         return cString; | 
|     } | 
|   | 
|     //获取到加密信息和机器码-解密信息返回 | 
|     public static String parsLicense(String key, String str) { | 
|         try { | 
|             str = str.replaceAll(confusionString3, "==").replaceAll(confusionString4, "=").replaceAll(confusionString2, "4M"); | 
|             String pString = decode64(str); | 
|             return decodeAES(getKeyStr(key), pString).replaceAll(confusionString, "Authorize"); | 
|         } catch (Exception ex) { | 
|   | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     public static String getMachineCode() { | 
|         StringBuffer sb = new StringBuffer(); | 
|         try { | 
|             InetAddress ia = InetAddress.getLocalHost(); | 
|             log.debug("IP:"+ia.getHostAddress()); | 
|             NetworkInterface byInetAddress = NetworkInterface.getByInetAddress(ia); | 
|             log.debug("网卡:"+byInetAddress.getName()); | 
|             byte[] mac = byInetAddress.getHardwareAddress(); | 
|             for (int i = 0; i < mac.length; i++) { | 
|                 if (i != 0) { | 
|                     sb.append("-"); | 
|                 } | 
|                 int temp = mac[i] & 0xff;//字节转换为整数 | 
|                 String str = Integer.toHexString(temp); | 
|                 if (str.length() == 1) { | 
|                     sb.append("0" + str); | 
|                 } else { | 
|                     sb.append(str); | 
|                 } | 
|             } | 
|             log.debug("mac:"+sb.toString().toUpperCase()); | 
|         } catch (Exception e) { | 
|             log.error("获取机器码异常:"+e.getMessage()); | 
|         } | 
|         String code = Md5Utils.hash(sb.toString().toUpperCase()); | 
|         log.debug("机器码:"+code); | 
|         return code; | 
|     } | 
|   | 
|     public static String getCPUCode() { | 
|         String serial = null; | 
|         try { | 
|             Process process = Runtime.getRuntime().exec(new String[]{"wmic", "cpu", "get", "ProcessorId"}); | 
|             process.getOutputStream().close(); | 
|             Scanner sc = new Scanner(process.getInputStream()); | 
|             String property = sc.next(); | 
|             serial = sc.next(); | 
|             serial = Md5Utils.hash(serial); | 
|             //System.out.println(property + ": " + serial); | 
|         } catch (IOException e) { | 
|             serial = null; | 
|         } | 
|         if (serial == null) { | 
|             serial = getMachineCode(); | 
|         } | 
|         return serial; | 
|     } | 
|   | 
|     //制作临时授权 | 
|     public static String makeTempLicense(String FilePath) { | 
|         String tempLicenseDate = ""; | 
|         String str = readToString(FilePath); | 
|         if (str.equals("")) {//没有授权文件 | 
|             Date date = new Date();//取时间 | 
|             Calendar calendar = new GregorianCalendar(); | 
|             calendar.setTime(date); | 
|             calendar.add(Calendar.DATE, 1);//把日期往后增加一天.正数往后推,负数往前推 | 
|             date = calendar.getTime();   //这个时间就是日期往后推一天的结果 | 
|             tempLicenseDate = (new java.text.SimpleDateFormat("yyyyMMddhhmmss")).format(date); | 
|             String machineCode = getMachineCode(); | 
|             String tempLicense = "{\"machineCode\":\"" + machineCode + "\",\"systemAuthorizeDate\":\"" + tempLicenseDate + "\"}"; | 
|             writeFile(FilePath, getLicense(getMachineCode(), tempLicense)); | 
|         } | 
|   | 
|         return tempLicenseDate; | 
|     } | 
|   | 
|     public static String parsLicense(String machineCode) { | 
|         String str = readToString("D:\\synjones.env\\license.cpy"); | 
|         String returnStr = ""; | 
|         //System.out.println("readfile "+str); | 
|         if (str.equals("")) {//没有授权文件 | 
|             returnStr = "null"; | 
|         } else { | 
|             try { | 
|                 returnStr = parsLicense(machineCode, str); | 
|             } catch (Exception e) { | 
|                 returnStr = "error"; | 
|             } | 
|         } | 
|   | 
|         return returnStr; | 
|     } | 
|   | 
|     public static String parsLicense() { | 
|         String authorizeCode = parsLicense(getMachineCode()); | 
|         if (authorizeCode.equals("error")) { | 
|             authorizeCode = parsLicense(getCPUCode()); | 
|         } | 
|         return authorizeCode; | 
|     } | 
|   | 
|     //base64编码 | 
|     public static String encode64(String src) { | 
|         byte[] encodeBytes = Base64.getEncoder().encode(src.getBytes()); | 
|         return new String(encodeBytes); | 
|     } | 
|   | 
|     //base64解码 | 
|     public static String decode64(String src) { | 
|         byte[] decodeBytes = Base64.getDecoder().decode(src.getBytes()); | 
|         return new String(decodeBytes); | 
|     } | 
|   | 
|     //AES加密 | 
|     public static String encodeAES(String key, String src) { | 
|         try { | 
|             KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); | 
|             keyGenerator.init(128);// size | 
|             SecretKey secretKey = keyGenerator.generateKey(); | 
|            // byte[] keyBytes = HexBin.decode(key); | 
|             byte[] keyBytes = DatatypeConverter.parseHexBinary(key); | 
|   | 
|             SecretKey generateKey = new SecretKeySpec(keyBytes, "AES"); | 
|   | 
|             Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); | 
|             cipher.init(Cipher.ENCRYPT_MODE, generateKey); | 
|             byte[] resultBytes = cipher.doFinal(src.getBytes()); | 
|   | 
|             return Hex.encodeHexString(resultBytes); | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|         } | 
|   | 
|         return null; | 
|     } | 
|   | 
|     public static void writeFile(String FilePath, String content) { | 
|         String FileName = FilePath.substring(FilePath.lastIndexOf("\\") + 1); | 
|         String FileDir = FilePath.substring(0, FilePath.lastIndexOf("\\") + 1); | 
|         FileOutputStream fileWriter; | 
|         OutputStreamWriter writer = null; | 
|         try { | 
|             File outDir = new File(FileDir); | 
|             if (!outDir.exists() && !outDir.isDirectory()) { | 
|                 outDir.mkdir(); | 
|             } | 
|   | 
|             String file = FilePath; | 
|             String charSet = "UTF-8"; | 
|             //写字符转换成字节流 | 
|             fileWriter = new FileOutputStream(file); | 
|             writer = new OutputStreamWriter(fileWriter, charSet); | 
|             writer.write(content); | 
|         } catch (IOException e1) { | 
|             // TODO Auto-generated catch block | 
|             e1.printStackTrace(); | 
|         } finally { | 
|             try { | 
|                 writer.close(); | 
|             } catch (IOException e) { | 
|                 // TODO Auto-generated catch block | 
|                 e.printStackTrace(); | 
|             } | 
|         } | 
|   | 
|   | 
|     } | 
|   | 
|     public static String readToString(String fileName) { | 
|         String encoding = "UTF-8"; | 
|         File file = new File(fileName); | 
|         Long filelength = file.length(); | 
|         byte[] filecontent = new byte[filelength.intValue()]; | 
|         try { | 
|             FileInputStream in = new FileInputStream(file); | 
|             in.read(filecontent); | 
|             in.close(); | 
|         } catch (FileNotFoundException e) { | 
|             return ""; | 
|         } catch (IOException e) { | 
|             return ""; | 
|         } | 
|         try { | 
|             return new String(filecontent, encoding); | 
|         } catch (UnsupportedEncodingException e) { | 
|             System.err.println("The OS does not support " + encoding); | 
|             e.printStackTrace(); | 
|             return ""; | 
|         } | 
|     } | 
|     //读取文件中的字符串 | 
|     public static String readFile(File file) { | 
|         BufferedReader reader = null; | 
|         try { | 
|             //用流读取文件 | 
|             reader = new BufferedReader(new FileReader(file)); | 
|             String line; | 
|             StringBuffer content = new StringBuffer(); | 
|             // 读取想定文件 | 
|             while ((line = reader.readLine()) != null) { | 
|                 content.append(line); | 
|             } | 
|             return content.toString(); | 
|         } catch (IOException e) { | 
|             return null; | 
|         } finally { | 
|             if (reader != null) { | 
|                 IOUtils.closeQuietly(reader); | 
|             } | 
|         } | 
|     } | 
|     //AES解密 | 
|     public static String decodeAES(String key, String src) { | 
|         try { | 
|            // byte[] keyBytes = HexBin.decode(key); | 
|             byte[] keyBytes = DatatypeConverter.parseHexBinary(key); | 
|             SecretKey generateKey = new SecretKeySpec(keyBytes, "AES"); | 
|             Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); | 
|             cipher.init(Cipher.DECRYPT_MODE, generateKey); | 
|             byte[] result = Hex.decodeHex(src.toCharArray()); | 
|             return new String(cipher.doFinal(result)); | 
|         } catch (Exception e) { | 
|             //e.printStackTrace(); | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     public static String encode(String key, String src) { | 
|         try { | 
|             KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); | 
|             keyGenerator.init(168);// size | 
|             SecretKey secretKey = keyGenerator.generateKey(); | 
|            // byte[] keyBytes = HexBin.decode(key); | 
|             byte[] keyBytes = DatatypeConverter.parseHexBinary(key); | 
|   | 
|             DESedeKeySpec desKeySpec = new DESedeKeySpec(keyBytes); | 
|             SecretKeyFactory secretKeyFactory = SecretKeyFactory | 
|                     .getInstance("DESede"); | 
|             SecretKey generateKey = secretKeyFactory.generateSecret(desKeySpec); | 
|   | 
|             Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); | 
|             cipher.init(Cipher.ENCRYPT_MODE, generateKey); | 
|             byte[] resultBytes = cipher.doFinal(src.getBytes()); | 
|   | 
|             return Hex.encodeHexString(resultBytes); | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|         } | 
|   | 
|         return null; | 
|     } | 
|   | 
| } |