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# DateTime.Now方法: 获取当前日期和时间

    C#中DateTime.Now的作用和使用方法 DateTime.Now 是 C# 中的一个静态属性,用于获取当前系统的日期和时间信息。 例如: DateTime now = DateTime.Now; Console.WriteLine(now); 输出: 2022/1/31 10:37:02 我们可以看到输出的格式为“年/月/日 时:分:秒”。 下面是 …

    C# 2023年4月19日
    00
  • C#实现刷新桌面的方法

    下面是“C#实现刷新桌面的方法”的完整攻略。 标题 介绍 在Windows系统中,桌面通常是我们经常使用的界面之一。有时候我们需要在程序中通过代码控制桌面的刷新,例如动态修改桌面背景等。本攻略将介绍如何通过C#代码实现刷新桌面的方法。 方法 在C#中,可以通过发送一条特定的消息显式地强制Windows桌面刷新。具体实现步骤如下: 步骤1 在代码中引入下列命名…

    C# 2023年6月1日
    00
  • C# 设计模式之单例模式归纳总结

    下面我将为你详细介绍“C# 设计模式之单例模式归纳总结”的攻略。 什么是单例模式? 单例模式是指保证一个类只有一个实例,并提供一个访问类唯一实例的全局访问点。 单例模式的优缺点 优点 提供唯一实例,避免了重复创建,节省了系统资源。 可以控制实例化的数量,减小系统与外界的耦合程度。 提供了全局访问点,方便对唯一实例的访问。 缺点 单例类的职责过重,一旦修改可能…

    C# 2023年5月31日
    00
  • springMVC+velocity实现仿Datatables局部刷新分页方法

    我们将使用SpringMVC和Velocity作为模板引擎来实现仿Datatables局部刷新分页的功能。以下是详细的步骤: 第一步:配置SpringMVC 为了使用SpringMVC,我们需要添加如下依赖: <dependency> <groupId>org.springframework</groupId> <a…

    C# 2023年5月31日
    00
  • ASP.NET 水晶报表打印功能实现代码

    ASP.NET 水晶报表打印功能实现,需要以下几个步骤: 在 Visual Studio 新建 ASP.NET Web 应用程序项目,并添加 Crystal Reports 报表文件。 在 Web.config 文件中添加以下代码,即配置 Crystal Reports: xml <configSections> <sectionGroup…

    C# 2023年5月31日
    00
  • c# 如何使用结构体实现共用体

    下面是一个详细讲解“C# 如何使用结构体实现共用体”的攻略: 什么是共用体 共用体(Union)是一种特殊的数据类型,它允许在同一内存位置存储不同的数据类型。共用体的大小为其最大成员的大小。 在 C 和 C++ 语言中,我们可以用共用体来实现一个拥有多种数据类型的变量。例如,我们可以定义一个名称为 myUnion 的共用体,它拥有一个整型变量和一个浮点型变量…

    C# 2023年6月6日
    00
  • C#判断字符是否为汉字的三种方法分享

    下面我会详细讲解“C#判断字符是否为汉字的三种方法分享”的完整攻略。 1.方法一:使用Unicode编码范围判断 汉字在Unicode编码中的范围是4E00~9FA5,因此可以使用Unicode编码范围来判断字符是否为汉字。 下面是示例代码: public bool IsChineseByRange(char c) { return (c >= 0x4…

    C# 2023年6月8日
    00
  • winform获取当前名称实例汇总

    要实现WinForm获取当前名称实例的功能,我们可以使用以下步骤: 1.使用System.Diagnostics.Process类获取当前正在运行的所有进程。 using System.Diagnostics; Process[] processes = Process.GetProcesses(); 2.使用LINQ查询找到我们需要的进程实例。 Proce…

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