C#——使用DES加密文件

参考自:https://www.cnblogs.com/linuxnotes/p/3290667.html
https://baike.baidu.com/item/des对称加密/9002660?fr=aladdin

DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。

        /// <summary>
        /// 加密文件
        /// </summary>
        /// <param name="filePath">源文件</param>
        /// <param name="savePath">保存文件</param>
        /// <param name="keyString">密钥</param>
        public static void EncryptFile(string filePath, string savePath, string keyString)
        {
            var des = GetDesCryptoServiceProvider(keyString);
            //创建加密器
            ICryptoTransform cryptoTransform = des.CreateEncryptor();
            CryptoFileContent(filePath, savePath, cryptoTransform);
        }

        /// <summary>
        /// 解密文件
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="savePath"></param>
        /// <param name="keyString"></param>
        public static void DecryptFile(string filePath, string savePath, string keyString)
        {
            var des = GetDesCryptoServiceProvider(keyString);
            //创建解密器
            ICryptoTransform cryptoTransform = des.CreateDecryptor();
            CryptoFileContent(filePath, savePath, cryptoTransform);
        }

        /// <summary>
        /// 获取加密服务提供者
        /// </summary>
        /// <param name="keyStr"></param>
        /// <returns></returns>
        private static DESCryptoServiceProvider GetDesCryptoServiceProvider(string keyStr)
        {
            byte[] keyBytes = Encoding.UTF8.GetBytes(keyStr);
            //计算指定字节组指定区域哈希值
            SHA1 sha = new SHA1Managed();
            byte[] hash = sha.ComputeHash(keyBytes);
            //加密密钥数组
            byte[] key = new byte[8];
            for (int i = 0; i < 8; i++)
            {
                key[i] = hash[i];
            }
            //DES加密
            DESCryptoServiceProvider des = new DESCryptoServiceProvider { Key = key, IV = key };
            return des;
        }

        /// <summary>
        /// 加密或解密文件内容
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="savePath"></param>
        /// <param name="cryptoTransform"></param>
        private static void CryptoFileContent(string filePath, string savePath, ICryptoTransform cryptoTransform)
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream =
                    new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write))
                {
                    var inputByteArray = ReadFileAsBytes(filePath);
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cryptoStream.FlushFinalBlock();
                    SaveFile(savePath, memoryStream);
                }
            }
        }

        /// <summary>
        /// 保存文件
        /// </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>
        /// 读取文件内容为字节
        /// </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;
            }
        }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值