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); } } }