From 59e3d40943a08c27b9cfdf31e134f3ccf5a03501 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=95=B8=E9=9D=9E?= <13281114856@qq.com>
Date: Tue, 21 Jun 2022 15:59:21 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9udp=20=E5=8A=A0=E5=AF=86?=
 =?UTF-8?q?=E8=A7=A3=E5=AF=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/mortals/xhx/common/key/Constant.java  |   5 +
 .../mortals/xhx/common/utils/EncryptUtil.java | 281 ++++++++++++++++++
 .../NettyStartedService.java                  |  12 +-
 .../handler/NettyUDPServerHandler.java        |  28 +-
 4 files changed, 311 insertions(+), 15 deletions(-)
 create mode 100644 device-manager/src/main/java/com/mortals/xhx/common/utils/EncryptUtil.java

diff --git a/device-manager/src/main/java/com/mortals/xhx/common/key/Constant.java b/device-manager/src/main/java/com/mortals/xhx/common/key/Constant.java
index 9be1bd38..55bcb32e 100644
--- a/device-manager/src/main/java/com/mortals/xhx/common/key/Constant.java
+++ b/device-manager/src/main/java/com/mortals/xhx/common/key/Constant.java
@@ -41,6 +41,11 @@ public final class Constant {
 	 * 浠ょ墝
 	 */
 	public static final String TOKEN = "token";
+	public static final String ENCRYPT_STR = "w4*KbUamPdZDnDpG";
+
+	public static final Integer SERVER_PORT = 8074;
+	public static final Integer CLIENT_PORT = 8073;
+
 
 	/**
 	 * 鍩虹鏈嶅姟骞冲彴閴存潈token
diff --git a/device-manager/src/main/java/com/mortals/xhx/common/utils/EncryptUtil.java b/device-manager/src/main/java/com/mortals/xhx/common/utils/EncryptUtil.java
new file mode 100644
index 00000000..fd9bba8c
--- /dev/null
+++ b/device-manager/src/main/java/com/mortals/xhx/common/utils/EncryptUtil.java
@@ -0,0 +1,281 @@
+package com.mortals.xhx.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * 鑷畾涔夌紪鐮併€佽В鐮�
+ */
+//鍔犲瘑杩囩▼锛氬師鏂�->base64->aes(1234567812345678)->des(12345678)->鍊掑簭锛�9浣嶏級->base64
+//瑙e瘑锛歜ase64->鍊掑簭(9浣�)->des(12345678)->aes(1234567812345678)->base64->鍘熸枃
+@Slf4j
+public class EncryptUtil {
+    public static final String ALGORITHM = "AES/ECB/PKCS5Padding";
+
+    /**
+     * 瀛楃涓茶浆鎹负Base64
+     *
+     * @param text
+     * @return
+     */
+    public static String toBase64(String text) {
+        Base64 base64 = new Base64();
+        try {
+            return base64.encodeToString(text.getBytes("utf-8")).trim().replace("\n", "");
+        } catch (UnsupportedEncodingException e) {
+            log.error("瀛楃涓茶浆鎹负Base64[{}]寮傚父", e);
+        }
+        return null;
+    }
+
+    /**
+     * Base64杞崲涓哄瓧绗︿覆
+     *
+     * @param text
+     * @return
+     */
+    private static String base64ToString(String text) {
+        Base64 base64 = new Base64();
+        try {
+            return new String(base64.decode(text.getBytes("utf-8")), "UTF-8").trim().replace("\n", "");
+        } catch (UnsupportedEncodingException e) {
+            log.error("Base64杞崲涓哄瓧绗︿覆[{}]寮傚父", e);
+        }
+        return null;
+    }
+
+
+    /**
+     * AES鍔犲瘑+Base64杞爜
+     *
+     * @param data 鏄庢枃锛�16杩涘埗锛�
+     * @param key  瀵嗛挜
+     * @return
+     */
+    public static String encrypt(String data, String key) {
+        try {
+            byte[] keys = key.getBytes("utf-8");
+            // 鏄庢枃
+            SecretKeySpec sKeySpec = new SecretKeySpec(keys, "AES");
+            //Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+            cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);
+            byte[] bjiamihou = cipher.doFinal(data.getBytes("utf-8"));
+            // byte鍔犲瘑鍚�,瀵嗘枃鐢╞ase64鍔犲瘑;
+            String miKey = Base64.encodeBase64String(bjiamihou);
+            return miKey;
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("AES鍔犲瘑[{}]寮傚父", e);
+        }
+        return null;
+    }
+
+    /**
+     * Base64瑙g爜 + AES瑙g爜
+     *
+     * @param data 瀵嗘枃 锛�16杩涘埗锛�
+     * @param key  瀵嗛挜
+     * @return
+     */
+    public static String decrypt(String data, String key) {
+        try {
+            byte[] keys = key.getBytes("utf-8");
+            byte[] datas = Base64.decodeBase64(data);
+            SecretKeySpec sKeySpec = new SecretKeySpec(keys, "AES");
+            //Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+            cipher.init(Cipher.DECRYPT_MODE, sKeySpec);
+            byte[] bjiemihou = cipher.doFinal(datas);
+            // byte鍔犲瘑鍚�
+            String miKey = new String(bjiemihou, "utf-8");
+            return miKey;
+        } catch (Exception e) {
+            log.error("AES瑙g爜[{}]寮傚父", e);
+        }
+        return null;
+    }
+
+    /**
+     * 杞寲涓篠tring
+     *
+     * @param buf
+     * @return
+     */
+    private static String parseByte2HexStr(byte buf[]) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < buf.length; i++) {
+            String hex = Integer.toHexString(buf[i] & 0xFF);
+            if (hex.length() == 1) {
+                hex = '0' + hex;
+            }
+            sb.append(hex.toUpperCase());
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 灏�16杩涘埗杞崲涓轰簩杩涘埗
+     *
+     * @param hexStr
+     * @return
+     */
+    private static byte[] parseHexStr2Byte(String hexStr) {
+        if (hexStr.length() < 1)
+            return null;
+        byte[] result = new byte[hexStr.length() / 2];
+        for (int i = 0; i < hexStr.length() / 2; i++) {
+            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
+            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
+            result[i] = (byte) (high * 16 + low);
+        }
+        return result;
+    }
+
+
+    /**
+     * DES鍔犲瘑锛堜娇鐢―ES绠楁硶锛�
+     *
+     * @param message 闇€瑕佸姞瀵嗙殑鏂囨湰
+     * @param key     瀵嗛挜
+     * @return 鎴愬姛鍔犲瘑鐨勬枃鏈�
+     */
+    public static String toDesString(String key, String message) throws Exception {
+        try {
+            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
+            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+            IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
+            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
+            return parseByte2HexStr(cipher.doFinal(message.getBytes("UTF-8")));
+        } catch (Exception e) {
+            log.error("DES鍔犲瘑[{}]寮傚父", e);
+        }
+        return null;
+    }
+
+    /**
+     * DES瑙e瘑锛堜娇鐢―ES绠楁硶锛�
+     *
+     * @param message 闇€瑕佽В瀵嗙殑鏂囨湰
+     * @param key     瀵嗛挜
+     * @return 鎴愬姛鍔犲瘑鐨勬枃鏈�
+     */
+    public static String desToString(String key, String message) throws Exception {
+        try {
+            byte[] bytesrc = parseHexStr2Byte(message);//convertHexString(message);
+            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
+            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+            IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
+            cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
+            byte[] retByte = cipher.doFinal(bytesrc);
+            return new String(retByte);
+        } catch (Exception e) {
+            log.error("DES瑙e瘑[{}]寮傚父", e);
+        }
+        return null;
+    }
+
+    public static byte[] convertHexString(String ss) {
+        byte digest[] = new byte[ss.length() / 2];
+        for (int i = 0; i < digest.length; i++) {
+            String byteString = ss.substring(2 * i, 2 * i + 2);
+            int byteValue = Integer.parseInt(byteString, 16);
+            digest[i] = (byte) byteValue;
+        }
+        return digest;
+    }
+
+    public static String toHexString(byte b[]) {
+        StringBuffer hexString = new StringBuffer();
+        for (int i = 0; i < b.length; i++) {
+            String plainText = Integer.toHexString(0xff & b[i]);
+            if (plainText.length() < 2)
+                plainText = "0" + plainText;
+            hexString.append(plainText);
+        }
+        return hexString.toString();
+    }
+
+
+    /**
+     * 鍊掑簭澶勭悊锛屾瘡orderNum浣嶈繘琛屽€掑簭鎺掑垪
+     *
+     * @param sourceString 涓洪渶瑕佸姞瀵嗙殑涓�
+     * @param orderNum     涓烘瘡x浣嶈繘琛屽€掑簭鎺掑垪
+     * @return
+     */
+    public static String toReverseString(int orderNum, String sourceString) {
+        String csFive = "", encrypted2 = "";
+        for (int i = 0; i < sourceString.length(); i++) {
+            csFive = csFive + sourceString.charAt(i);
+            if ((i + 1) % orderNum == 0 || (i + 1) >= sourceString.length()) {
+                String csFive2 = "";
+                for (int j = 0; j < csFive.length(); j++) {
+                    csFive2 = csFive2 + csFive.charAt(csFive.length() - 1 - j);
+                }
+                encrypted2 += csFive2;
+                csFive = "";
+            }
+        }
+        return encrypted2;
+    }
+
+    /**
+     * 鍔犲瘑
+     *
+     * @return
+     */
+    public static String myEnscrt(String sourceString, int orderNum, String desKey, String aesKey) throws Exception {
+        //鍔犲瘑杩囩▼锛氬師鏂�->base64->aes(1234567812345678)->des(12345678)->鍊掑簭锛�9浣嶏級->base64
+        String base64String = toBase64(sourceString);
+        String aesString = encrypt(base64String, aesKey);
+        //System.out.println("aseString==="+aesString);
+        String desString = toDesString(desKey, aesString);
+        String reverseString = toReverseString(orderNum, desString);
+        String result = toBase64(reverseString);
+        return result;
+    }
+
+    /**
+     * 瑙e瘑
+     *
+     * @return
+     */
+    public static String myReEnscrt(String targetString, int orderNum, String desKey, String aesKey) throws Exception {
+        //瑙e瘑锛歜ase64->鍊掑簭(9浣�)->des(12345678)->aes(1234567812345678)->base64->鍘熸枃
+        String reverseString = base64ToString(targetString);
+        //System.out.println("reverseString"+reverseString);
+        String desString = toReverseString(orderNum, reverseString);
+        //System.out.println("desString"+desString);
+        String aesString = desToString(desKey, desString);
+       // System.out.println("aesString"+aesString);
+        String base64String = decrypt(aesString, aesKey);
+       // System.out.println("base64String"+base64String);
+        String result = base64ToString(base64String);
+        return result;
+    }
+
+    public static void main(String[] args) {
+        try {
+            String s = EncryptUtil.myEnscrt("7E:20:F5:32:60:6A", 9, "FZV1D&tr", "w4*KbUamPdZDnDpG");
+            System.out.println("a===="+ s);
+            String sa = EncryptUtil.myReEnscrt(s, 9, "FZV1D&tr", "w4*KbUamPdZDnDpG");
+            System.out.println("sa===="+sa);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/device-manager/src/main/java/com/mortals/xhx/daemon/applicationservice/NettyStartedService.java b/device-manager/src/main/java/com/mortals/xhx/daemon/applicationservice/NettyStartedService.java
index d19cb652..9cf788ea 100644
--- a/device-manager/src/main/java/com/mortals/xhx/daemon/applicationservice/NettyStartedService.java
+++ b/device-manager/src/main/java/com/mortals/xhx/daemon/applicationservice/NettyStartedService.java
@@ -8,6 +8,8 @@ import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import static com.mortals.xhx.common.key.Constant.SERVER_PORT;
+
 /**
  * netty udp 鏈嶅姟鍚姩
  *
@@ -16,20 +18,20 @@ import org.springframework.stereotype.Component;
  */
 @Component
 public class NettyStartedService implements IApplicationStartedService {
-    
+
     private static Log logger = LogFactory.getLog(NettyStartedService.class);
 
     @Autowired
     private ControlServer controlServer;
 
-    private   Thread thread =null;
+    private Thread thread = null;
 
 
     @Override
     public void start() {
         logger.info("寮€濮媙etty鏈嶅姟....");
-         thread = new Thread(() -> {
-            controlServer.run(7788);
+        thread = new Thread(() -> {
+            controlServer.run(SERVER_PORT);
         });
         thread.setDaemon(true);
         thread.start();
@@ -40,7 +42,7 @@ public class NettyStartedService implements IApplicationStartedService {
     public void stop() {
         logger.info("鍋滄鏈嶅姟..");
 
-        if(thread!=null){
+        if (thread != null) {
             thread.interrupt();
         }
     }
diff --git a/device-manager/src/main/java/com/mortals/xhx/daemon/netty/server/controlserver/handler/NettyUDPServerHandler.java b/device-manager/src/main/java/com/mortals/xhx/daemon/netty/server/controlserver/handler/NettyUDPServerHandler.java
index 2c4a34b2..488634f4 100644
--- a/device-manager/src/main/java/com/mortals/xhx/daemon/netty/server/controlserver/handler/NettyUDPServerHandler.java
+++ b/device-manager/src/main/java/com/mortals/xhx/daemon/netty/server/controlserver/handler/NettyUDPServerHandler.java
@@ -1,9 +1,11 @@
 package com.mortals.xhx.daemon.netty.server.controlserver.handler;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.mortals.framework.ap.GlobalSysInfo;
 import com.mortals.xhx.busiz.rsp.ApiResp;
 import com.mortals.xhx.common.code.YesNoEnum;
+import com.mortals.xhx.common.utils.EncryptUtil;
 import com.mortals.xhx.module.device.service.DeviceService;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
@@ -12,10 +14,11 @@ import io.netty.channel.SimpleChannelInboundHandler;
 import io.netty.channel.socket.DatagramPacket;
 import io.netty.util.CharsetUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.ObjectUtils;
 
 import java.net.InetSocketAddress;
 
-import static com.mortals.xhx.common.key.Constant.PARAM_SERVER_HTTP_URL;
+import static com.mortals.xhx.common.key.Constant.*;
 
 
 /**
@@ -40,21 +43,26 @@ public class NettyUDPServerHandler extends SimpleChannelInboundHandler<DatagramP
         byte[] bytes = new byte[byteBuf.readableBytes()];
         byteBuf.readBytes(bytes);
         String content = new String(bytes);
+        content = EncryptUtil.decrypt(content, ENCRYPT_STR);
+
         log.info("receive->UDP:{}", packet.sender().toString() + "," + content);
 
-        // TODO 璁惧杩斿洖鏈嶅姟绔厤缃�
-        String URL = GlobalSysInfo.getParamValue(PARAM_SERVER_HTTP_URL, "http://192.168.0.98:11021");
-        // String req = msg.content().toString(CharsetUtil.UTF_8);
+        JSONObject jsonObject = JSON.parseObject(content);
+
+        String action = jsonObject.getString("action");
         ApiResp<String> resp = new ApiResp<>();
         resp.setCode(YesNoEnum.YES.getValue());
         resp.setMsg("鑾峰彇鏈嶅姟绔湴鍧€鎴愬姛锛�");
-        resp.setData(URL);
-
-
-        //InetSocketAddress remoteAddress = new InetSocketAddress("255.255.255.255", 7789);
-        InetSocketAddress remoteAddress = new InetSocketAddress( packet.sender().getHostName(), 7789);
-        DatagramPacket sendpacket =new DatagramPacket(Unpooled.copiedBuffer(JSON.toJSONString(resp), CharsetUtil.UTF_8),remoteAddress);
+        if (!ObjectUtils.isEmpty(action) && "findserver".equals(action)) {
+            String URL = GlobalSysInfo.getParamValue(PARAM_SERVER_HTTP_URL, "http://192.168.0.98:11021");
+            resp.setData(URL);
+        } else {
+            resp.setCode(YesNoEnum.NO.getValue());
+            resp.setMsg("璇锋眰鍙傛暟寮傚父锛�");
+        }
 
+        InetSocketAddress remoteAddress = new InetSocketAddress(packet.sender().getHostName(), CLIENT_PORT);
+        DatagramPacket sendpacket = new DatagramPacket(Unpooled.copiedBuffer(EncryptUtil.encrypt(JSON.toJSONString(resp), ENCRYPT_STR), CharsetUtil.UTF_8), remoteAddress);
         //ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(JSON.toJSONString(resp), CharsetUtil.UTF_8), packet.sender()));
         ctx.writeAndFlush(sendpacket);
 
-- 
2.24.3