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