From 4eb04e6f0ffb45651cbffa958c4d05f0edf6e795 Mon Sep 17 00:00:00 2001 From: = <=> Date: Tue, 7 Nov 2023 16:46:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9encoder=E5=92=8Cdecoder?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=8A=A0=E5=AF=86=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/ProxyMessageSecureKeyHandler.java | 2 +- .../core/ProxyMessageDecoder.java | 35 ++++++++++++++----- .../core/ProxyMessageEncoder.java | 34 +++++++++++++----- 3 files changed, 54 insertions(+), 17 deletions(-) diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageSecureKeyHandler.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageSecureKeyHandler.java index 05a5361e..09da501c 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageSecureKeyHandler.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageSecureKeyHandler.java @@ -22,7 +22,7 @@ public class ProxyMessageSecureKeyHandler implements ProxyMessageHandler { byte[] decryptedData = SmEncryptUtil.decryptBySm4(secureKey, data); String m = new String(decryptedData); if ("ok".equals(m)) { - log.info("Successfully established encrypted link"); + log.info("Encrypted link established successfully"); } else { ctx.channel().close(); } diff --git a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessageDecoder.java b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessageDecoder.java index 2729967a..3fa077d9 100644 --- a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessageDecoder.java +++ b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessageDecoder.java @@ -23,8 +23,12 @@ package org.dromara.neutrinoproxy.core; import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.util.Attribute; +import org.dromara.neutrinoproxy.core.util.SmEncryptUtil; + import static org.dromara.neutrinoproxy.core.Constants.*; /** @@ -70,28 +74,43 @@ public class ProxyMessageDecoder extends LengthFieldBasedFrameDecoder { return null; } - int frameLength = in.readInt(); - if (in.readableBytes() < frameLength) { + int packageLength = in.readInt(); + if (in.readableBytes() < packageLength) { return null; } + + // 获取加密数据 + byte[] encryptedBytes = new byte[packageLength]; + in.readBytes(encryptedBytes); + in.release(); + + // 获取解密密钥 + Attribute secureKeyAttr = ctx.attr(SECURE_KEY); + byte[] secureKey = secureKeyAttr.get(); + // 解密 + byte[] decryptedData = SmEncryptUtil.decryptBySm4(secureKey, encryptedBytes); + + ByteBuf buf = Unpooled.wrappedBuffer(decryptedData); + ProxyMessage proxyMessage = new ProxyMessage(); - byte type = in.readByte(); - long sn = in.readLong(); + int frameLength = buf.readInt(); + byte type = buf.readByte(); + long sn = buf.readLong(); proxyMessage.setSerialNumber(sn); proxyMessage.setType(type); - int infoLength = in.readInt(); + int infoLength = buf.readInt(); byte[] infoBytes = new byte[infoLength]; - in.readBytes(infoBytes); + buf.readBytes(infoBytes); proxyMessage.setInfo(new String(infoBytes)); byte[] data = new byte[frameLength - TYPE_SIZE - SERIAL_NUMBER_SIZE - INFO_LENGTH_SIZE - infoLength]; - in.readBytes(data); + buf.readBytes(data); proxyMessage.setData(data); - in.release(); + buf.release(); return proxyMessage; } diff --git a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessageEncoder.java b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessageEncoder.java index 447d2432..c4eb67e3 100644 --- a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessageEncoder.java +++ b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessageEncoder.java @@ -23,8 +23,12 @@ package org.dromara.neutrinoproxy.core; import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; +import io.netty.util.Attribute; +import org.dromara.neutrinoproxy.core.util.SmEncryptUtil; + import static org.dromara.neutrinoproxy.core.Constants.*; /** @@ -40,6 +44,7 @@ public class ProxyMessageEncoder extends MessageToByteEncoder { @Override protected void encode(ChannelHandlerContext ctx, ProxyMessage msg, ByteBuf out) throws Exception { + int bodyLength = TYPE_SIZE + SERIAL_NUMBER_SIZE + INFO_LENGTH_SIZE; byte[] infoBytes = null; if (msg.getInfo() != null) { @@ -51,21 +56,34 @@ public class ProxyMessageEncoder extends MessageToByteEncoder { bodyLength += msg.getData().length; } - // write the total packet length but without length field's length. - out.writeInt(bodyLength); + ByteBuf buf = Unpooled.buffer(bodyLength); - out.writeByte(msg.getType()); - out.writeLong(msg.getSerialNumber()); + // write the total packet length but without length field's length. + buf.writeInt(bodyLength); + + buf.writeByte(msg.getType()); + buf.writeLong(msg.getSerialNumber()); if (infoBytes != null) { - out.writeInt(infoBytes.length); - out.writeBytes(infoBytes); + buf.writeInt(infoBytes.length); + buf.writeBytes(infoBytes); } else { - out.writeInt(0x00); + buf.writeInt(0x00); } if (msg.getData() != null) { - out.writeBytes(msg.getData()); + buf.writeBytes(msg.getData()); } + + // 执行加密 + byte[] data = new byte[bodyLength]; + buf.readBytes(data); + // 获取加密密钥 + Attribute secureKeyAttr = ctx.attr(SECURE_KEY); + byte[] secureKey = secureKeyAttr.get(); + // 执行加密 + byte[] encryptedData = SmEncryptUtil.encryptBySm4(secureKey, data); + out.writeByte(encryptedData.length); + out.writeBytes(encryptedData); } }