// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 // // SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: // 1.请不要删除和修改根目录下的LICENSE文件。 // 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 // 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin // 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; //加密和解密结构相同,只不过,解密密钥是加密密钥的逆序 /// /// Sm4算法 /// 对标国际DES算法 /// public class SM4Util { public SM4Util() { Key = "1814546261730461";//密钥长度必须为16字节。 Iv = "0000000000000000"; HexString = false; CryptoMode = Sm4CryptoEnum.ECB; } /// /// 数据 /// public string Data { get; set; } /// /// 秘钥 /// public string Key { get; }//不同的key,加密出来的数据不一样,所以此处设定好key以后,禁止修改 /// /// 向量 /// public string Iv { get; set; } /// /// 明文是否是十六进制 /// public bool HexString { get; }//set; /// /// 加密模式(默认ECB) /// 统一改为ECB模式 /// public Sm4CryptoEnum CryptoMode { get; } #region 加密 public static string Encrypt(SM4Util entity) { return entity.CryptoMode == Sm4CryptoEnum.CBC ? EncryptCBC(entity) : EncryptECB(entity); } /// /// ECB加密 /// /// /// public static string EncryptECB(SM4Util entity) { var ctx = new Sm4Context { IsPadding = true }; var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); var sm4 = new SM4CryptoUtil(); sm4.SetKeyEnc(ctx, keyBytes); var encrypted = sm4.Sm4CryptEcb(ctx, Encoding.Default.GetBytes(entity.Data)); return Encoding.Default.GetString(Hex.Encode(encrypted)); } /// /// CBC加密 /// /// /// public static string EncryptCBC(SM4Util entity) { var ctx = new Sm4Context { IsPadding = true }; var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); var sm4 = new SM4CryptoUtil(); sm4.SetKeyEnc(ctx, keyBytes); var encrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Encoding.Default.GetBytes(entity.Data)); return Convert.ToBase64String(encrypted); } #endregion 加密 #region 解密 /// /// 解密 /// /// /// public static string Decrypt(SM4Util entity) { return entity.CryptoMode == Sm4CryptoEnum.CBC ? DecryptCBC(entity) : DecryptECB(entity); } /// /// ECB解密 /// /// /// public static string DecryptECB(SM4Util entity) { var ctx = new Sm4Context { IsPadding = true, Mode = 0 }; var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); var sm4 = new SM4CryptoUtil(); sm4.Sm4SetKeyDec(ctx, keyBytes); var decrypted = sm4.Sm4CryptEcb(ctx, Hex.Decode(entity.Data)); return Encoding.Default.GetString(decrypted); } /// /// CBC解密 /// /// /// public static string DecryptCBC(SM4Util entity) { var ctx = new Sm4Context { IsPadding = true, Mode = 0 }; var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); var sm4 = new SM4CryptoUtil(); sm4.Sm4SetKeyDec(ctx, keyBytes); var decrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Convert.FromBase64String(entity.Data)); return Encoding.Default.GetString(decrypted); } #endregion 解密 /// /// 加密类型 /// public enum Sm4CryptoEnum { /// /// ECB(电码本模式) /// [Description("ECB模式")] ECB = 0, /// /// CBC(密码分组链接模式) /// [Description("CBC模式")] CBC = 1 } }