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(); 
 | 
        System.out.println("sysStr " + ss.parsLicense()); 
 | 
        System.out.println("MachineCode " + ss.getMachineCode()); 
 | 
        System.out.println("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()); 
 | 
        } 
 | 
        return Md5Utils.hash(sb.toString().toUpperCase()); 
 | 
    } 
 | 
  
 | 
    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; 
 | 
    } 
 | 
  
 | 
} 
 |