C#中SM3加解密
public static class Sm3Crypto { /// <summary> /// sm3加密(使用自定义密钥) /// </summary> /// <param name="data"></param> /// <returns></returns> public static byte[] ToSM3byte(string data, string key) { byte[] msg1 = Encoding.Default.GetBytes(data); byte[] key1 = Encoding.Default.GetBytes(key); KeyParameter keyParameter = new KeyParameter(key1); SM3Digest sm3 = new SM3Digest(); HMac mac = new HMac(sm3);//带密钥的杂凑算法 mac.Init(keyParameter); mac.BlockUpdate(msg1, 0, msg1.Length); byte[] result = new byte[mac.GetMacSize()]; mac.DoFinal(result, 0); return Hex.Encode(result); } /// <summary> /// sm3加密 /// </summary> /// <param name="data"></param> /// <returns>二进制数组</returns> public static byte[] ToSM3byte(string data) { var msg = Encoding.Default.GetBytes(data);//把字符串转成16进制的ASCII码 SM3Digest sm3 = new SM3Digest(); sm3.BlockUpdate(msg, 0, msg.Length); byte[] md = new byte[sm3.GetDigestSize()];//SM3算法产生的哈希值大小 sm3.DoFinal(md, 0); return Hex.Encode(md); } /// <summary> /// sm3加密 /// </summary> /// <param name="data"></param> /// <returns>16进制字符串</returns> public static string ToSM3HexStr(string data) { var msg = Encoding.Default.GetBytes(data);//把字符串转成16进制的ASCII码 SM3Digest sm3 = new SM3Digest(); sm3.BlockUpdate(msg, 0, msg.Length); byte[] md = new byte[sm3.GetDigestSize()];//SM3算法产生的哈希值大小 sm3.DoFinal(md, 0); return new UTF8Encoding().GetString(Hex.Encode(md)); } /// <summary> /// sm3加密(使用自定义Hex密钥) /// </summary> /// <param name="data"></param> /// <param name="key"></param> /// <returns></returns> public static string ToSM3HexStr(string data, string key) { byte[] msg1 = Encoding.Default.GetBytes(data); byte[] key1 = HexStringToBytes(key); KeyParameter keyParameter = new KeyParameter(key1); SM3Digest sm3 = new SM3Digest(); HMac mac = new HMac(sm3);//带密钥的杂凑算法 mac.Init(keyParameter); mac.BlockUpdate(msg1, 0, msg1.Length); byte[] result = new byte[mac.GetMacSize()]; mac.DoFinal(result, 0); return new UTF8Encoding().GetString(Hex.Encode(result)); } /// <summary> /// 16进制格式字符串转字节数组 /// </summary> /// <param name="hexString"></param> /// <returns></returns> public static byte[] HexStringToBytes(string hexString) { hexString = Regex.Replace(hexString, @".{2}", "$0 "); //以 ' ' 分割字符串,并去掉空字符 string[] chars = hexString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); byte[] returnBytes = new byte[chars.Length]; //逐个字符变为16进制字节数据 for (int i = 0; i < chars.Length; i++) { returnBytes[i] = Convert.ToByte(chars[i], 16); } return returnBytes; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)