‘liusuyi’
2023-08-22 bbafde6d4aecbbfaa452570faeaa25b4058d3a28
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
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;
    }
 
}