C#AES加密

2021-02-16 17:17

阅读:589

标签:例子   style   指定   image   字符串转换   end   alt   进制   解密   

今天写个接口,要求如下,需要对应的AES加密(128位),例子php的

技术分享图片

C#实现

/// 
        ///  AES 加密 输出hex格式
        /// 
        /// 明文(待加密)
        /// 密文
        /// 
        public static string AesEncrypt(string str, string key)
        {
            if (string.IsNullOrEmpty(str)) return null;
            Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);

            System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                Mode = System.Security.Cryptography.CipherMode.ECB,
                Padding = System.Security.Cryptography.PaddingMode.Zeros //加密什么格式对应改为就行,基本的话应该为PKCS7
            };

            System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            //return Convert.ToBase64String(resultArray, 0, resultArray.Length);
            return ByteArrayToHexString(resultArray);
        }


    /// 
    /// 将一个byte数组转换成一个格式化的16进制字符串
    /// 
    /// byte数组
    /// 格式化的16进制字符串
    public static string ByteArrayToHexString(byte[] data)
    {
        StringBuilder sb = new StringBuilder(data.Length * 3);
        foreach (byte b in data)
        {
            //16进制数字
            sb.Append(Convert.ToString(b, 16).PadLeft(2, 0));
            //16进制数字之间以空格隔开
            //sb.Append(Convert.ToString(b, 16).PadLeft(2, ‘0‘).PadRight(3, ‘ ‘));
        }
        return sb.ToString().ToUpper();
    }
     /// 
        ///  AES 解密 输出hex格式
        /// 
        /// 明文(待解密)
        /// 密文
        /// 
        public static string AesDecrypt(string str, string key)
        {
            if (string.IsNullOrEmpty(str)) return null;
            //Byte[] toEncryptArray = Convert.FromBase64String(str);
            byte[] toEncryptArray = HexStringToByteArray(str);

            System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                Mode = System.Security.Cryptography.CipherMode.ECB,
                Padding = System.Security.Cryptography.PaddingMode.Zeros
            };

            System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Encoding.UTF8.GetString(resultArray);
        }
        

      
    /// 
    /// 将指定的16进制字符串转换为byte数组
    /// 
    /// 16进制字符串(如:“7F 2C 4A”或“7F2C4A”都可以)
    /// 16进制字符串对应的byte数组
    public static byte[] HexStringToByteArray(string s)
    {
        s = s.Replace(" ", "");
        byte[] buffer = new byte[s.Length / 2];
        for (int i = 0; i 2)
            buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
        return buffer;
    }

输出为Base64将我注释的取消就行,这个是因为需求要的是hex格式

 

C#AES加密

标签:例子   style   指定   image   字符串转换   end   alt   进制   解密   

原文地址:https://www.cnblogs.com/Cein/p/8406428.html

上一篇:C#中HashTable的用法

下一篇:C# MD5加密


评论


亲,登录后才可以留言!