C#实现简单的文件加密与解密方式

C#实现简单的文件加密与解密方式攻略

介绍

本文详细讲解如何使用C#语言实现简单的文件加密与解密方式。文件加密是数据保护的一种方法,通过对敏感文件进行加密,确保在未授权的情况下无法访问和解读文件内容。本文讲解将使用对称加密算法 AES 实现文件加密与解密。

实现过程

  1. 导入 System.Security.Cryptography 命名空间。该命名空间提供了对称加密算法的支持。
using System.Security.Cryptography;
  1. 创建一个加解密类。
public class AesEncryption
{
    // 加密密钥
    private static readonly byte[] key = Encoding.UTF8.GetBytes("0123456789abcdefghijklmnopqrstuvwxyz");

    // 初始化向量
    private static readonly byte[] iv = Encoding.UTF8.GetBytes("9876543210zyxwvutsrqponmlkjihgfedcba");

    // 加密方法
    public static void EncryptFile(string inputFile, string outputFile)
    {
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
            aes.Key = key;
            aes.IV = iv;

            using (FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(fsOutput, aes.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        byte[] buffer = new byte[4096];
                        int read = 0;

                        while ((read = fsInput.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            cryptoStream.Write(buffer, 0, read);
                        }

                        cryptoStream.FlushFinalBlock();
                    }
                }
            }
        }
    }

    // 解密方法
    public static void DecryptFile(string inputFile, string outputFile)
    {
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
            aes.Key = key;
            aes.IV = iv;

            using (FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(fsOutput, aes.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        byte[] buffer = new byte[4096];
                        int read = 0;

                        while ((read = fsInput.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            cryptoStream.Write(buffer, 0, read);
                        }

                        cryptoStream.FlushFinalBlock();
                    }
                }
            }
        }
    }
}
  1. 调用加密与解密方法。
string inputFile = "path\\to\\input\\file.txt";
string encryptedFile = "path\\to\\encrypted\\file.enc";
string decryptedFile = "path\\to\\decrypted\\file.txt";

// 文件加密
AesEncryption.EncryptFile(inputFile, encryptedFile);

// 文件解密
AesEncryption.DecryptFile(encryptedFile, decryptedFile);

示例

示例1

以下示例将读取 inputfile.txt 中的文本内容,使用 AES 对称加密算法对文本内容进行加密,将加密结果输出到 encryptedfile.txt 中,然后再将 encryptedfile.txt 文件进行解密,并输出到 decryptedfile.txt 中。

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class AesEncryption
{
    // 加密密钥
    private static readonly byte[] key = Encoding.UTF8.GetBytes("0123456789abcdefghijklmnopqrstuvwxyz");

    // 初始化向量
    private static readonly byte[] iv = Encoding.UTF8.GetBytes("9876543210zyxwvutsrqponmlkjihgfedcba");

    // 加密方法
    public static void EncryptFile(string inputFile, string outputFile)
    {
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
            aes.Key = key;
            aes.IV = iv;

            using (FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(fsOutput, aes.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        byte[] buffer = new byte[4096];
                        int read = 0;

                        while ((read = fsInput.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            cryptoStream.Write(buffer, 0, read);
                        }

                        cryptoStream.FlushFinalBlock();
                    }
                }
            }
        }
    }

    // 解密方法
    public static void DecryptFile(string inputFile, string outputFile)
    {
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
            aes.Key = key;
            aes.IV = iv;

            using (FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(fsOutput, aes.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        byte[] buffer = new byte[4096];
                        int read = 0;

                        while ((read = fsInput.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            cryptoStream.Write(buffer, 0, read);
                        }

                        cryptoStream.FlushFinalBlock();
                    }
                }
            }
        }
    }
}

public class Program
{
    static void Main(string[] args)
    {
        string inputFile = @"C:\data\inputfile.txt";
        string encryptedFile = @"C:\data\encryptedfile.enc";
        string decryptedFile = @"C:\data\decryptedfile.txt";

        // 文件加密
        AesEncryption.EncryptFile(inputFile, encryptedFile);

        // 文件解密
        AesEncryption.DecryptFile(encryptedFile, decryptedFile);

        Console.WriteLine("File encryption and decryption has been completed.");
    }
}

示例2

以下示例将读取指定路径下的 inputfile.jpg图片,使用 AES 对称加密算法对图片进行加密,并将其输出到 encryptedfile.jpg 中,再将 encryptedfile.jpg 文件进行解密,并输出到 decryptedfile.jpg 中。

public class AesEncryption
{
    // 加密密钥
    private static readonly byte[] key = Encoding.UTF8.GetBytes("0123456789abcdefghijklmnopqrstuvwxyz");

    // 初始化向量
    private static readonly byte[] iv = Encoding.UTF8.GetBytes("9876543210zyxwvutsrqponmlkjihgfedcba");

    // 加密方法
    public static void EncryptFile(string inputFile, string outputFile)
    {
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
            aes.Key = key;
            aes.IV = iv;

            using (FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(fsOutput, aes.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        byte[] buffer = new byte[4096];
                        int read = 0;

                        while ((read = fsInput.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            cryptoStream.Write(buffer, 0, read);
                        }

                        cryptoStream.FlushFinalBlock();
                    }
                }
            }
        }
    }

    // 解密方法
    public static void DecryptFile(string inputFile, string outputFile)
    {
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
            aes.Key = key;
            aes.IV = iv;

            using (FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(fsOutput, aes.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        byte[] buffer = new byte[4096];
                        int read = 0;

                        while ((read = fsInput.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            cryptoStream.Write(buffer, 0, read);
                        }

                        cryptoStream.FlushFinalBlock();
                    }
                }
            }
        }
    }
}

public class Program
{
    static void Main(string[] args)
    {
        string inputFile = @"C:\data\inputfile.jpg";
        string encryptedFile = @"C:\data\encryptedfile.jpg";
        string decryptedFile = @"C:\data\decryptedfile.jpg";

        // 文件加密
        AesEncryption.EncryptFile(inputFile, encryptedFile);

        // 文件解密
        AesEncryption.DecryptFile(encryptedFile, decryptedFile);

        Console.WriteLine("File encryption and decryption has been completed.");
    }
}

结论

本文以 AES 对称加密算法为例,讲解了 C# 实现简单的文件加密与解密方式攻略。读者可以在实际应用中根据需要,选择不同的加密算法实现更加安全的文件加密功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现简单的文件加密与解密方式 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#中数组扩容的几种方式介绍

    C#中数组扩容的几种方式介绍 在C#中,数组的长度是固定的,但在实际开发中,我们经常需要动态地改变数组的大小。这时,我们就需要使用数组扩容的方法。本文将介绍C#中数组扩容的几种方式。 1.使用Array类的Resize方法 Array类是C#中用于操作数组的基类,它提供了Resize方法,可以用来调整数组的大小。Resize方法的格式如下: Array.Re…

    C# 2023年5月15日
    00
  • 浅谈C#基础之类的访问修饰符

    浅谈C#基础之类的访问修饰符 C#中共有5种访问修饰符,分别为public、private、protected、internal和protected internal。不同的访问修饰符可以在不同的范围内控制类、方法、属性、字段及其他成员的可访问性。 public访问修饰符 public访问修饰符用于指定一个类、方法、属性或字段可以从任何其他类(包括其他项目中…

    C# 2023年5月31日
    00
  • ASP.NET MVC在基控制器中处理Session

    处理Session是ASP.NET开发中的一个常见需求。我们可以在ASP.NET MVC的基控制器中统一处理Session,这样可以更方便地管理Session数据,也提高了代码的复用性。 以下是基控制器中处理Session的完整攻略: 创建一个基控制器 首先,在项目中创建一个基控制器,该基控制器将包含所有控制器所需的公共方法和属性。在该基控制器中处理Sess…

    C# 2023年5月31日
    00
  • C#中常用的正则表达式

    下面来详细讲解”C#中常用的正则表达式”的完整攻略。 正则表达式的基础概念 正则表达式(Regular Expression)是一种用来描述或者匹配一组字符串的方法,它基于一些字符和特殊符号的组合,用来表示一些规则。在 C# 中,可以使用 System.Text.RegularExpressions 命名空间下的 Regex 类来处理正则表达式。 正则表达式…

    C# 2023年6月8日
    00
  • ASP.net 路径问题 详解

    下面我将为你详细讲解ASP.NET路径问题的攻略。 一、背景知识 在ASP.NET中,路径问题是非常常见的。在编写代码或引用文件时,我们需要使用路径来定位所需的资源或文件。但是,不同的路径表示方式有可能导致不同的结果。因此,了解不同路径的含义和规则是非常重要的。 二、基本概念 在ASP.NET中,我们常使用以下几种路径表示方式: 1. 相对路径 相对路径是以…

    C# 2023年6月3日
    00
  • 简单聊一聊Go语言中的数组和切片

    简单聊一聊Go语言中的数组和切片 在Go语言中,数组和切片是两种常用的数据结构。本文将提供一个详细的Go语言中数组和切片的攻略,包括定义、初始化、访问、遍历、添加、删除等操作。 数组 定义和初始化 在Go语言中,数组是一种固定长度的数据结构,可以存储相同类型的元素。可以按照以下方式定义和初始化数组: var arr [5]int // 定义一个长度为5的in…

    C# 2023年5月15日
    00
  • c#中如何获取指定字符前的字符串

    在C#中获取指定字符(或字符串)前的字符串,可以采用String类的Substring和IndexOf方法来实现。 方法1:Substring方法 Substring方法是String类提供的一个获取子字符串的方法,可以通过指定起始位置和截取长度来获取指定范围的子字符串。我们可以通过查找指定字符(或字符串)的位置,然后取其前面的子串来获取需要的字符串。 示例…

    C# 2023年6月6日
    00
  • C# 重写Notification提示窗口的示例代码

    下面是详细讲解“C# 重写Notification提示窗口的示例代码”的完整攻略: 一、什么是Notification提示窗口 Notification提示窗口就是Windows操作系统的一个提示框,一般用于通知用户系统的一些状态变化或提示信息。它一般弹出在屏幕的右下角,显示一定的时间之后会自动消失。 二、怎样重写Notification提示窗口 要重写No…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部