Newer
Older
SensorHub / SensorHub.Servers / SM4 / SM4Utils.cs
root on 17 Sep 2021 2 KB first commit
using MySql.Data.MySqlClient;
using Org.BouncyCastle.Utilities.Encoders;
using SensorHub.Servers.MySql;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SensorHub.Servers.SM4
{
    public class SM4Utils
    {
        public static byte[] sm4Encrypt(byte[] plainBytes, String devcode)
        {
            String secretKey = getSecretKeyByDevcode(devcode);
            if (secretKey == "")
            {
                secretKey = System.Configuration.ConfigurationManager.AppSettings["secretKey"];
            }

            SM4_Context ctx = new SM4_Context();
            ctx.isPadding = true;
            ctx.mode = SM4.SM4_ENCRYPT;

            byte[] keyBytes = Hex.Decode(secretKey);

            SM4 sm4 = new SM4();
            sm4.sm4_setkey_enc(ctx, keyBytes);
            byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainBytes);

            return encrypted;
        }

        public static String sm4Decrypt(byte[] cipherBytes, String devcode)
        {
            String secretKey = getSecretKeyByDevcode(devcode);
            if (secretKey == "")
            {
                secretKey = System.Configuration.ConfigurationManager.AppSettings["secretKey"];
            }

            SM4_Context ctx = new SM4_Context();
            ctx.isPadding = true;
            ctx.mode = SM4.SM4_DECRYPT;

            byte[] keyBytes = Hex.Decode(secretKey);

            SM4 sm4 = new SM4();
            sm4.sm4_setkey_dec(ctx, keyBytes);
            byte[] decrypted = sm4.sm4_crypt_ecb(ctx, cipherBytes);
            return Hex.ToHexString(decrypted);
        }

        private static String getSecretKeyByDevcode(String devcode)
        {
            MySqlParameter[] param = new MySqlParameter[]{
                        new MySqlParameter("@DEVCODE",devcode)
                    };

            DataTable dt = SensorHub.Servers.MySql.MySqlHelper.GetDataSet("select * from bus_device where devcode=@DEVCODE and valid='1'", param).Tables[0];
            if (dt.Rows.Count > 0)
            {
                if (null != dt.Rows[0]["SECRET_KEY"])
                {
                    String secretKey = dt.Rows[0]["SECRET_KEY"].ToString();
                    return secretKey;
                }
            }

            return "";
        }

        public static int updateSecretKeyByDevcode(String devcode,String secretKey)
        {
            MySqlParameter[] param = new MySqlParameter[]{
                        new MySqlParameter("@DEVCODE",devcode),
                        new MySqlParameter("@SECRETKEY",secretKey)
                    };

            return SensorHub.Servers.MySql.MySqlHelper.ExecuteNonQuery("UPDATE bus_device SET secret_key=@SECRETKEY WHERE devcode=@DEVCODE and valid='1'", param);
        }
    }
}