欢迎光临散文网 会员登陆 & 注册

DES类

2021-12-14 20:16 作者:佳语顺  | 我要投稿

 #region DES文件

public static void LogsAdd(string str)

{

}

        /// <summary>

        /// 判断是否十进制格式字符串

        /// </summary>

        /// <param name="str">字符串</param>

        /// <returns>true 是  false 不是</returns>

        public static bool IsDecimal(string str)

        {

            if (string.IsNullOrEmpty(str))

                return false;

            const string PATTERN = @"([^0-9]|\s+?)+";

            if (System.Text.RegularExpressions.Regex.IsMatch(str, PATTERN))

            {

                LogsAdd("输入错误:有非法字符串!");

                return false;

            }

            return true;

        }

        /// <summary>

        /// 十进制字符串转字节数组

        /// </summary>

        /// <param name="str">字符串</param>

        /// <returns></returns>

        public static byte[] DecimalStringToByte(string str)

        {

            if (string.IsNullOrEmpty(str))

            {

                LogsAdd("输入错误:输入字符串为空!");

                return null;

            }

            if (IsDecimal(str))

            {

                int splitBase = 3;

                if (str.Length % splitBase == 0)

                {

                    int len = str.Length / splitBase;

                    byte[] arr_des = new byte[len];

                    for (int i = 0; i < len; i++)

                    {

                        int a = Convert.ToInt32(str.Substring(i * splitBase, splitBase));

                        if (a > 255)

                        {

                            LogsAdd("输入错误:输入值大于255!");

                            return null;

                        }

                        arr_des[i] = Convert.ToByte(a);

                    }

                    LogsAdd("十进制字符串转字节数组转换成功。");

                    return arr_des;

                }

                else

                    LogsAdd("输入错误:长度不对!");

            }

            return null;

        }

        /// <summary>

        /// 字节数组转十进制字符串

        /// </summary>

        /// <param name="Byte"></param>

        /// <param name="interval"></param>

        /// <returns></returns>

        public static string ByteToDecimalString(byte[] Byte, string interval = "")

        {

            StringBuilder result = new StringBuilder();

            if (Byte != null)

            {

                foreach (byte b in Byte)

                {

                    result.Append(b.ToString("D3") + interval);

                }

                LogsAdd("字节转十进制字符串转换成功。");

                return result.ToString();

            }

            LogsAdd("字节为空!");

            return null;

        }

        /// <summary>

        /// DES字符串加密。CBC模式

        /// </summary>

        /// <param name="targetValue">加密字符串</param>

        /// <param name="key">秘钥只能是8位(不支持中文)</param>

        /// <param name="iv">向量要大于或等于8位</param>

        /// <param name="encoding">加密字符串编码</param>

        /// <returns>输出加密字符,字符串类型(十进制值输出)</returns>

        public static string DesCBCEncrypt(string targetValue, string key, string iv, string encoding = "UTF-8")

        {

            string str_des = null;

            if (key.Length != 8 | iv.Length < 8)

            {

                LogsAdd("DES失败:密码长度不是8位或向量小于8位!");

                return str_des;

            }

            if (string.IsNullOrEmpty(targetValue))

            {

                LogsAdd("DES失败:加密字符串为空!");

                return str_des;

            }

            try

            {

                byte[] arr_key = Encoding.UTF8.GetBytes(key.Substring(0, 8));

                byte[] arr_iv = Encoding.UTF8.GetBytes(iv);//.Substring(0, 4)

                byte[] arr_str = Encoding.GetEncoding(encoding).GetBytes(targetValue);

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                MemoryStream mStream = new MemoryStream();//实例化内存流对象

                des.Mode = CipherMode.CBC;//指定要用于加密的块密码模式。

                using (CryptoStream cs = new CryptoStream(mStream, des.CreateEncryptor(arr_key, arr_iv), CryptoStreamMode.Write))//将数据流链接到加密转换的流。           

                {

                    cs.Write(arr_str, 0, arr_str.Length);

                }

                str_des = ByteToDecimalString(mStream.ToArray());

                LogsAdd("DES成功!");

                return str_des;

            }

            catch (Exception ex)

            {

                LogsAdd("DES失败:" + ex.Message);

                return str_des;

            }

        }

        /// <summary>

        /// DES字符串解密。CBC模式

        /// </summary>

        /// <param name="targetValue">加密字符串</param>

        /// <param name="key">秘钥只能是8位(不支持中文)</param>

        /// <param name="iv">向量要大于或等于8位</param>

        /// <param name="encoding">加密字符串编码</param>

        /// <returns>输出加密字符,字符串类型(十进制值输出)</returns>

        public static string DesCBCDecrypt(string targetValue, string key, string iv, string encoding = "UTF-8")

        {

            string str_des = null;

            if (key.Length != 8 | iv.Length < 8)

            {

                LogsAdd("DES失败:密码长度不是8位或向量小于8位!");

                return str_des;

            }

            if (string.IsNullOrEmpty(targetValue))

            {

                LogsAdd("DES失败:加密字符串为空!");

                return str_des;

            }

            try

            {

                //定义字节数组用来存放密钥 GetBytes方法用于将字符串中所有字节编码为一个字节序列

                byte[] arr_key = Encoding.UTF8.GetBytes(key.Substring(0, 8));

                byte[] arr_iv = Encoding.UTF8.GetBytes(iv);//.Substring(0, 4)

                byte[] arr_des = DecimalStringToByte(targetValue);

                MemoryStream ms = new MemoryStream();

                //方法定义加密对象

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                des.Mode = CipherMode.CBC;

                using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(arr_key, arr_iv), CryptoStreamMode.Write))

                {

                    cs.Write(arr_des, 0, arr_des.Length);

                }

                str_des = Encoding.GetEncoding(encoding).GetString(ms.ToArray());

                LogsAdd("DES成功!");

                return str_des;

            }

            catch (Exception ex)

            {

                LogsAdd("DES失败:" + ex.Message);

                return str_des;

            }

        }

        /// <summary>

        /// DES字符串加密。ECB模式

        /// </summary>

        /// <param name="targetValue">加密字符串</param>

        /// <param name="key">秘钥只能是8位(不支持中文)</param>

        /// <param name="iv">没有用</param>

        /// <param name="encoding">加密字符串编码</param>

        /// <returns>输出加密字符,字符串类型(Base64)</returns>

        public static string DesEBCEncrypt(string targetValue, string key, string iv, string encoding = "UTF-8")

        {

            string str_des = null;

            if (key.Length != 8)

            {

                LogsAdd("DES失败:密码长度不是8位!");

                return str_des;

            }

            if (string.IsNullOrEmpty(targetValue))

            {

                LogsAdd("DES失败:加密字符串为空!");

                return str_des;

            }

            try

            {

                byte[] arr_key = Encoding.UTF8.GetBytes(key);

                byte[] arr_iv = Encoding.UTF8.GetBytes(iv.Substring(0, 8));//如果字符串长度大于8个,截取前面8个字符串

                byte[] arr_str = Encoding.GetEncoding(encoding).GetBytes(targetValue);

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                MemoryStream mStream = new MemoryStream();//实例化内存流对象

                des.Mode = CipherMode.ECB;//指定要用于加密的块密码模式。

                using (CryptoStream cs = new CryptoStream(mStream, des.CreateEncryptor(arr_key, arr_iv), CryptoStreamMode.Write))//将数据流链接到加密转换的流。

                {

                    cs.Write(arr_str, 0, arr_str.Length);

                }

                str_des = Convert.ToBase64String(mStream.ToArray());

                LogsAdd("DES成功!");

                return str_des;

            }

            catch (Exception ex)

            {

                LogsAdd("DES失败:" + ex.Message);

                return str_des;

            }

        }

        /// <summary>

        /// DES字符串解密。ECB模式

        /// </summary>

        /// <param name="targetValue">加密字符串</param>

        /// <param name="key">秘钥只能是8位(不支持中文)</param>

        /// <param name="iv">没有用</param>

        /// <param name="encoding">加密字符串编码</param>

        /// <returns>输出加密字符,字符串类型(Base64)</returns>

        public static string DesEBCDecrypt(string targetValue, string key, string iv, string encoding = "UTF-8")

        {

            string str_des = null;

            if (key.Length != 8)

            {

                LogsAdd("DES失败:密码长度不是8位!");

                return str_des;

            }

            if (string.IsNullOrEmpty(targetValue))

            {

                LogsAdd("DES失败:加密字符串为空!");

                return str_des;

            }

            try

            {

                //定义字节数组用来存放密钥 GetBytes方法用于将字符串中所有字节编码为一个字节序列

                byte[] arr_key = Encoding.UTF8.GetBytes(key);//.Substring(0, 8)

                byte[] arr_iv = Encoding.UTF8.GetBytes(iv);//.Substring(0, 8)

                byte[] arr_des = Convert.FromBase64String(targetValue);

                MemoryStream mStream = new MemoryStream();

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                des.Mode = CipherMode.ECB;

                using (CryptoStream cs = new CryptoStream(mStream, des.CreateDecryptor(arr_key, arr_iv), CryptoStreamMode.Write))

                {

                    cs.Write(arr_des, 0, arr_des.Length);

                    //cs.FlushFinalBlock();

                    //cs.Close();

                }

                str_des = Encoding.GetEncoding(encoding).GetString(mStream.ToArray());

                LogsAdd("DES成功!");

                return str_des;

            }

            catch (Exception ex)

            {

                LogsAdd("DES失败:" + ex.Message);

                return str_des;

            }

        }

        /// <summary>

        /// DES文件加密。CBC模式

        /// </summary>

        /// <param name="filePath">源文件</param>

        /// <param name="savePath">保存文件</param>

        /// <param name="keyString">秘钥只能是8位(不支持中文)</param>

        /// <param name="ivString">向量要大于或等于8位</param>

        /// <returns>成功返回1,失败返回-1</returns>

        public static int DesCBCEncryptFile(string filePath, string savePath, string keyString, string ivString)

        {

            int i = -1;

            var des = GetDesCryptoServiceProvider(keyString, ivString);

            if (des == null)

                return i;

            ICryptoTransform cryptoTransform = des.CreateEncryptor();

            if (CryptoFileContent(filePath, savePath, cryptoTransform) == 1)

                return 1;

            return i;

        }

        /// <summary>

        /// DES文件解密。CBC模式

        /// </summary>

        /// <param name="filePath">源文件</param>

        /// <param name="savePath">保存文件</param>

        /// <param name="keyString">秘钥只能是8位(不支持中文)</param>

        /// <param name="ivString">向量要大于或等于8位</param>

        /// <returns>成功返回1,失败返回-1</returns>

        public static int DesCBCDecryptFile(string filePath, string savePath, string keyString, string ivString)

        {

            int i = -1;

            var des = GetDesCryptoServiceProvider(keyString, ivString);

            if (des == null)

                return i;

            ICryptoTransform cryptoTransform = des.CreateDecryptor();

            if (CryptoFileContent(filePath, savePath, cryptoTransform) == 1)

                return 1;

            return i;

        }

        /// <summary>

        /// DES获取加密服务提供者,SHA一次在截取8位。

        /// </summary>

        /// <param name="keyString">秘钥只能是8位(不支持中文)</param>

        /// <param name="ivString">向量要大于或等于8位</param>

        /// <returns>成功返回DESCryptoServiceProvider类型,失败返回null</returns>

        private static DESCryptoServiceProvider GetDesCryptoServiceProvider(string keyStr, string ivStr)

        {

            if (keyStr.Length != 8 | ivStr.Length != 8)

            {

                LogsAdd("DES失败:密码长度不是8位或向量长度不是8位!");

                return null;

            }

            byte[] keyBytes = Encoding.UTF8.GetBytes(keyStr);

            SHA1 keysha = new SHA1Managed();//计算指定字节组指定区域哈希值

            byte[] keyhash = keysha.ComputeHash(keyBytes);

            //加密密钥数组

            byte[] key = new byte[8];

            for (int i = 0; i < 8; i++)

            {

                key[i] = keyhash[i];

            }

            byte[] ivBytes = Encoding.UTF8.GetBytes(ivStr);

            SHA1 ivsha = new SHA1Managed();//计算指定字节组指定区域哈希值

            byte[] ivhash = ivsha.ComputeHash(keyBytes);

            //加密密钥数组

            byte[] iv = new byte[8];

            for (int i = 0; i < 8; i++)

            {

                iv[i] = ivhash[i];

            }

            DESCryptoServiceProvider des = new DESCryptoServiceProvider { Key = key, IV = iv };

            return des;

        }

        /// <summary>

        /// DES或文件内容

        /// </summary>

        /// <param name="filePath"></param>

        /// <param name="savePath"></param>

        /// <param name="cryptoTransform"></param>

        /// <returns>成功返回1,失败返回-1</returns>

        private static int CryptoFileContent(string filePath, string savePath, ICryptoTransform cryptoTransform)

        {

            int i = -1;

            if (!File.Exists(filePath))

            {

                LogsAdd("DES失败:指定文件 " + filePath + " 找不到.");

                return i;

            }

            byte[] inputByteArray = null;

            FileStream fileStream;

            try

            {

                using (MemoryStream memoryStream = new MemoryStream())

                {

                    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write))

                    {

                        fileStream = File.OpenRead(filePath);

                        using (BinaryReader binaryReader = new BinaryReader(fileStream))

                        {

                            inputByteArray = new byte[fileStream.Length];

                            binaryReader.Read(inputByteArray, 0, inputByteArray.Length);

                        }

                        cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);

                        cryptoStream.FlushFinalBlock();

                        using (fileStream = File.OpenWrite(savePath))

                        {

                            memoryStream.WriteTo(fileStream);

                        }

                    }

                }

                LogsAdd("DES成功!");

                return 1;

            }

            catch (Exception ex)

            {

                LogsAdd("DES失败:" + ex.Message);

                return i;

            }

        }

        ///// <summary>

        ///// DES保存文件

        ///// </summary>

        ///// <param name="savePath"></param>

        ///// <param name="memoryStream"></param>

        //private static void SaveFile(string savePath, MemoryStream memoryStream)

        //{

        //    using (FileStream fileStream = File.OpenWrite(savePath))

        //    {

        //        memoryStream.WriteTo(fileStream);

        //    }

        //}

        ///// <summary>

        ///// DES读取文件内容为字节

        ///// </summary>

        ///// <param name="filePath"></param>

        ///// <returns></returns>

        //private static byte[] ReadFileAsBytes(string filePath)

        //{

        //    FileStream fileStream = File.OpenRead(filePath);

        //    using (BinaryReader binaryReader = new BinaryReader(fileStream))

        //    {

        //        byte[] inputByteArray = new byte[fileStream.Length];

        //        binaryReader.Read(inputByteArray, 0, inputByteArray.Length);

        //        return inputByteArray;

        //    }

        //}

        #endregion


DES类的评论 (共 条)

分享到微博请遵守国家法律