From a74b28b52a5bb259fa6372f8919a6dc561d37110 Mon Sep 17 00:00:00 2001
From: SmallChi <564952747@qq.com>
Date: Sat, 9 Jun 2018 10:53:28 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=A0=E8=A7=A3=E5=AF=86?=
 =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=BE=85=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/GBNewEnergy.Protocol/INEEncrypt.cs        | 12 ++++++++
 src/GBNewEnergy.Protocol/NEEncryptFactory.cs  | 28 +++++++++++++++++++
 .../NEEncrypts/NE_AES128EncryptImpl.cs        | 20 +++++++++++++
 .../NEEncrypts/NE_RSAEncryptImpl.cs           | 20 +++++++++++++
 src/GBNewEnergy.Protocol/NEPackage.cs         | 25 +++++++++++++++--
 .../NEProperties/NEPackageProperty.cs         |  1 +
 6 files changed, 104 insertions(+), 2 deletions(-)
 create mode 100644 src/GBNewEnergy.Protocol/INEEncrypt.cs
 create mode 100644 src/GBNewEnergy.Protocol/NEEncryptFactory.cs
 create mode 100644 src/GBNewEnergy.Protocol/NEEncrypts/NE_AES128EncryptImpl.cs
 create mode 100644 src/GBNewEnergy.Protocol/NEEncrypts/NE_RSAEncryptImpl.cs

diff --git a/src/GBNewEnergy.Protocol/INEEncrypt.cs b/src/GBNewEnergy.Protocol/INEEncrypt.cs
new file mode 100644
index 0000000..c1ca80d
--- /dev/null
+++ b/src/GBNewEnergy.Protocol/INEEncrypt.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GBNewEnergy.Protocol
+{
+    public interface INEEncrypt
+    {
+        byte[] Encrypt(byte[] buffer);
+        byte[] Eecrypt(byte[] buffer);
+    }
+}
diff --git a/src/GBNewEnergy.Protocol/NEEncryptFactory.cs b/src/GBNewEnergy.Protocol/NEEncryptFactory.cs
new file mode 100644
index 0000000..44403c4
--- /dev/null
+++ b/src/GBNewEnergy.Protocol/NEEncryptFactory.cs
@@ -0,0 +1,28 @@
+using GBNewEnergy.Protocol.Enums;
+using GBNewEnergy.Protocol.NEEncrypts;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GBNewEnergy.Protocol
+{
+    internal class NEEncryptFactory
+    {
+        internal static INEEncrypt GetNEEncrypt(NEEncryptMethod nEEncryptMethod)
+        {
+            switch (nEEncryptMethod)
+            {
+                case NEEncryptMethod.None:
+                case NEEncryptMethod.Invalid:
+                case NEEncryptMethod.Exception:
+                    return null;
+                case NEEncryptMethod.AES128:
+                    return new NE_AES128EncryptImpl();
+                case NEEncryptMethod.RSA:
+                    return new NE_RSAEncryptImpl();
+                default:
+                    return null;
+            }
+        }
+    }
+}
diff --git a/src/GBNewEnergy.Protocol/NEEncrypts/NE_AES128EncryptImpl.cs b/src/GBNewEnergy.Protocol/NEEncrypts/NE_AES128EncryptImpl.cs
new file mode 100644
index 0000000..eee7be6
--- /dev/null
+++ b/src/GBNewEnergy.Protocol/NEEncrypts/NE_AES128EncryptImpl.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GBNewEnergy.Protocol.NEEncrypts
+{
+#warning 待加解密
+    public class NE_AES128EncryptImpl : INEEncrypt
+    {
+        public byte[] Eecrypt(byte[] buffer)
+        {
+            throw new NotImplementedException();
+        }
+
+        public byte[] Encrypt(byte[] buffer)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
diff --git a/src/GBNewEnergy.Protocol/NEEncrypts/NE_RSAEncryptImpl.cs b/src/GBNewEnergy.Protocol/NEEncrypts/NE_RSAEncryptImpl.cs
new file mode 100644
index 0000000..207a2ae
--- /dev/null
+++ b/src/GBNewEnergy.Protocol/NEEncrypts/NE_RSAEncryptImpl.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GBNewEnergy.Protocol.NEEncrypts
+{
+#warning 待加解密
+    public class NE_RSAEncryptImpl : INEEncrypt
+    {
+        public byte[] Eecrypt(byte[] buffer)
+        {
+            throw new NotImplementedException();
+        }
+
+        public byte[] Encrypt(byte[] buffer)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
diff --git a/src/GBNewEnergy.Protocol/NEPackage.cs b/src/GBNewEnergy.Protocol/NEPackage.cs
index 6fbb95e..be19d32 100644
--- a/src/GBNewEnergy.Protocol/NEPackage.cs
+++ b/src/GBNewEnergy.Protocol/NEPackage.cs
@@ -70,6 +70,11 @@ namespace GBNewEnergy.Protocol
         /// 数据体
         /// </summary>
         public NEBodies Bodies { get; protected set; }
+        /// <summary>
+        /// 数据单元加密
+        /// 当数据单元存在加密时,应先加密后校验,先校验后解密
+        /// </summary>
+        private INEEncrypt Encrypt;
 
         protected override void ToBuffer()
         {
@@ -83,7 +88,14 @@ namespace GBNewEnergy.Protocol
             Buffer.WriteLittle(VIN, 4);
             Buffer[21] = (byte)EncryptMethod;
             Buffer.WriteLittle(DataUnitLength, 22, 2);
-            Buffer.WriteLittle(Bodies.Buffer, 24, DataUnitLength);
+            if (Encrypt != null)
+            {
+                Buffer.WriteLittle(Encrypt.Encrypt(Bodies.Buffer), 24, DataUnitLength);
+            }
+            else
+            {
+                Buffer.WriteLittle(Bodies.Buffer, 24, DataUnitLength);
+            }
             BCCCode = Buffer.ToXor(2, (HeaderFixedByteLength + DataUnitLength - 1));
             Buffer[HeaderFixedByteLength + DataUnitLength] = BCCCode;
             Header = new byte[HeaderFixedByteLength];
@@ -98,6 +110,7 @@ namespace GBNewEnergy.Protocol
             AskId = nEPackageProperty.AskId;
             Bodies = nEPackageProperty.Bodies;
             EncryptMethod = nEPackageProperty.EncryptMethod;
+            Encrypt = NEEncryptFactory.GetNEEncrypt(EncryptMethod);
         }
 
         protected override void InitializePropertiesFromBuffer()
@@ -107,6 +120,7 @@ namespace GBNewEnergy.Protocol
             AskId = (NEAskId)Buffer[3];
             VIN = Buffer.ReadStringLittle(4, 17);
             EncryptMethod = (NEEncryptMethod)Buffer[21];
+            Encrypt = NEEncryptFactory.GetNEEncrypt(EncryptMethod);
             DataUnitLength = Buffer.ReadUShortH2LLittle(22, 2);
             // 进行BCC校验码
             // 校验位 = 报文长度 - 最后一位(校验位) - 偏移量(2)
@@ -120,7 +134,14 @@ namespace GBNewEnergy.Protocol
             BCCCode = bCCCode2;
             byte[] bodiesBytes = new byte[DataUnitLength + CheckBit];
             Array.Copy(Buffer, HeaderFixedByteLength, bodiesBytes, 0, bodiesBytes.Length);
-            Bodies = NEBodiesFactory.GetNEBodiesByMsgId(MsgId, bodiesBytes);
+            if (Encrypt != null)
+            {
+                Bodies = NEBodiesFactory.GetNEBodiesByMsgId(MsgId, Encrypt.Eecrypt(bodiesBytes));
+            }
+            else
+            {
+                Bodies = NEBodiesFactory.GetNEBodiesByMsgId(MsgId, bodiesBytes);
+            }
             Header = new byte[HeaderFixedByteLength];
             Array.Copy(Buffer, 0, Header, 0, HeaderFixedByteLength);
         }
diff --git a/src/GBNewEnergy.Protocol/NEProperties/NEPackageProperty.cs b/src/GBNewEnergy.Protocol/NEProperties/NEPackageProperty.cs
index c5f7d56..d0fe270 100644
--- a/src/GBNewEnergy.Protocol/NEProperties/NEPackageProperty.cs
+++ b/src/GBNewEnergy.Protocol/NEProperties/NEPackageProperty.cs
@@ -12,5 +12,6 @@ namespace GBNewEnergy.Protocol.NEProperties
         public NEAskId AskId { get; set; }
         public NEBodies Bodies { get; set; }
         public NEEncryptMethod EncryptMethod { get; set; }
+        public INEEncrypt Encrypt { get; set; }
     }
 }