c# 图片加密解密的实例代码

c# 图片加密解密是一种通过对图片进行加密操作来保障图片内容安全的方法。下面我们将提供一份完整的攻略,介绍如何使用c#实现图片加密解密。

准备工作

在开始之前,我们需要先下载并安装c#运行环境,常用的c#开发环境有Visual Studio和Visual Studio Code。本攻略将使用Visual Studio 2019作为开发环境。

实现过程

图片加解密的实现中,主要涉及到以下步骤:

1. 加载图片

首先,我们需要将要加密的图片文件加载进来。可以使用Image.FromFile方法来实现这一步骤。示例代码如下:

Image originalImage = Image.FromFile("originalImage.bmp");

2. 将图片转换成二进制流

接下来,我们需要将图片文件转换为二进制流以便进一步的加密处理。可以使用MemoryStreamBinaryWriter来将图片文件转换为二进制流。示例代码如下:

MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
originalImage.Save(ms, ImageFormat.Bmp);
byte[] imageData = ms.ToArray();

3. 加密二进制流

在将图片文件转换成二进制流之后,我们可以通过对二进制流进行加密来保障图片数据的安全。常用的加密算法有DES、AES等。具体示例代码如下:

byte[] key = Encoding.UTF8.GetBytes("myKey");
byte[] iv = Encoding.UTF8.GetBytes("myIV");
DESCryptoServiceProvider crypt = new DESCryptoServiceProvider();
crypt.Mode = CipherMode.CBC;
crypt.Key = key;
crypt.IV = iv;
MemoryStream encStream = new MemoryStream();
CryptoStream cs = new CryptoStream(encStream, crypt.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(imageData, 0, imageData.Length);
cs.FlushFinalBlock();
byte[] encryptedData = encStream.ToArray();
cs.Close();
encStream.Close();

4. 将加密后的二进制流转换回图片

加密二进制流之后,我们需要将其转换回可供展示的图片格式。可以使用MemoryStreamBinaryWriterImage.FromStream等方法将加密后的二进制流转换成图片文件。具体示例代码如下:

MemoryStream decStream = new MemoryStream(encryptedData);
DESCryptoServiceProvider crypt2 = new DESCryptoServiceProvider();
crypt2.Mode = CipherMode.CBC;
crypt2.Key = key;
crypt2.IV = iv;
BinaryReader br = new BinaryReader(decStream);
byte[] decryptedData = crypt2.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Length);
decStream.Read(decryptedData, 0, decryptedData.Length);
decStream.Seek(0, SeekOrigin.Begin);
Image decryptedImage = Image.FromStream(decStream);

示例说明

下面我们将使用两个示例来说明c#图片加密解密的实现方法。

示例1

我们有一张名称为originalImage.bmp的图片文件,我们需要将其加密并保存为名称为encryptedImage.bmp的图片文件。

示例代码如下:

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

namespace ImageEncryptor
{
    class Program
    {
        static void Main(string[] args)
        {
            // load original image
            Image originalImage = Image.FromFile("originalImage.bmp");

            // convert image to byte array
            MemoryStream ms = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(ms);
            originalImage.Save(ms, ImageFormat.Bmp);
            byte[] imageData = ms.ToArray();
            bw.Close();
            ms.Close();

            // encrypt image data
            byte[] key = Encoding.UTF8.GetBytes("myKey");
            byte[] iv = Encoding.UTF8.GetBytes("myIV");
            DESCryptoServiceProvider crypt = new DESCryptoServiceProvider();
            crypt.Mode = CipherMode.CBC;
            crypt.Key = key;
            crypt.IV = iv;
            MemoryStream encStream = new MemoryStream();
            CryptoStream cs = new CryptoStream(encStream, crypt.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(imageData, 0, imageData.Length);
            cs.FlushFinalBlock();
            byte[] encryptedData = encStream.ToArray();
            cs.Close();
            encStream.Close();

            // convert encrypted data to image
            MemoryStream decStream = new MemoryStream(encryptedData);
            BinaryReader br = new BinaryReader(decStream);
            byte[] decryptedData = crypt.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Length);

            // create new image from decrypted data
            decStream.Seek(0, SeekOrigin.Begin);
            Image decryptedImage = Image.FromStream(decStream);
            decryptedImage.Save("encryptedImage.bmp", ImageFormat.Bmp);
        }
    }
}

示例2

我们需要从名称为encryptedImage.bmp的图片文件中解密出原始图片并展示出来。

示例代码如下:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;

namespace ImageEncryptor
{
    class Program
    {
        static void Main(string[] args)
        {
            // load and decrypt image
            byte[] imageData = File.ReadAllBytes("encryptedImage.bmp");
            byte[] key = Encoding.UTF8.GetBytes("myKey");
            byte[] iv = Encoding.UTF8.GetBytes("myIV");
            DESCryptoServiceProvider crypt = new DESCryptoServiceProvider();
            crypt.Mode = CipherMode.CBC;
            crypt.Key = key;
            crypt.IV = iv;
            MemoryStream encStream = new MemoryStream(imageData);
            CryptoStream cs = new CryptoStream(encStream, crypt.CreateDecryptor(), CryptoStreamMode.Read);
            MemoryStream decStream = new MemoryStream();
            int data;
            while ((data = cs.ReadByte()) != -1)
            {
                decStream.WriteByte((byte)data);
            }
            byte[] decryptedData = decStream.ToArray();
            cs.Close();
            encStream.Close();
            decStream.Close();

            // create and show image
            Image image = Image.FromStream(new MemoryStream(decryptedData));
            PictureBox pictureBox = new PictureBox();
            pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;
            pictureBox.Image = image;
            Form form = new Form();
            form.Controls.Add(pictureBox);
            form.Show();
        }
    }
}

运行以上两个示例代码之后,我们即可成功加密和解密一张图片文件。

结束语

通过本攻略的介绍,我们学习了使用c#实现图片加密解密的方法,同时提供了两个实际应用的代码示例,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 图片加密解密的实例代码 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • C#使用udp如何实现消息的接收和发送

    下面是详细讲解“C#使用udp如何实现消息的接收和发送”的攻略,希望对您有所帮助。 UDP协议简介 UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的传输协议,能够在局域网和广域网的IP网络中实现高效的数据传输。它在传输数据时不提供可靠性和完整性的保证,但是却具有速度快、延迟低等优点,因此在实时性较高的应用场景中被广泛使…

    C# 2023年6月6日
    00
  • C#实现加密bat文件的示例详解

    C# 实现加密 bat 文件的示例详解 引言 加密 bat 文件可以保护命令脚本中的敏感信息,防止其被其他人查看或篡改。本文将从以下几个方面详细介绍 C# 实现加密 bat 文件的过程: 加载 bat 文件内容 对 bat 文件内容进行加密 将加密后的 bat 文件内容写入 bat 文件 升级加密算法 加载 bat 文件内容 要将 bat 文件加密,首先需要…

    C# 2023年6月1日
    00
  • C#实现的SQL备份与还原功能示例

    标题:C#实现的SQL备份与还原功能示例 介绍:本文提供了关于如何使用C#实现SQL数据库备份和还原的示例,包括备份和还原的代码示例和详细的步骤说明。 第一步。连接数据库 在C#中连接数据库需要使用System.Data.SqlClient命名空间。首先,我们需要新建一个SqlConnection对象,并对该对象设置连接字符串: using System.D…

    C# 2023年6月2日
    00
  • C#封装的Sqlite访问类实例

    下面是详细讲解“C#封装的Sqlite访问类实例”的完整攻略。 一、Sqlite简介 Sqlite是一个轻量级的关系型数据库管理系统,它的特点是轻巧、可嵌入、可移植和高效,在单机或低并发情况下是一个非常好的选择。在C#中,我们可以使用System.Data.Sqlite命名空间提供的Sqlite连接器来访问Sqlite数据库。 二、C#封装的Sqlite访问…

    C# 2023年5月31日
    00
  • Asp.Net MVC中配置Serilog的方法

    Serilog是一个.NET平台上的日志库,可以方便地记录应用程序的日志信息。在Asp.Net MVC中,我们可以使用Serilog来记录应用程序的日志信息。以下是在Asp.Net MVC中配置Serilog的方法的完整攻略。 环境准备 在使用Serilog前,需要安装Serilog和Serilog.Sinks.File包。可以使用以下命令来安装Serilo…

    C# 2023年5月15日
    00
  • Entity Framework模型优先与实体对象查询

    Entity Framework是一个开源的ORM(Object Relational Mapping)框架,它允许我们通过使用.Net语言进行开发工作,同时又隐藏了底层ORM Query语言的操作,从而大大减轻了我们的工作负担。 在EF中,有两种常见的开发模式:数据库优先和模型优先。其中,模型优先的方式作为一种高效、简化开发过程的策略,更加广泛使用。在EF…

    C# 2023年6月3日
    00
  • C#创建自定义控件及添加自定义属性和事件使用实例详解

    很高兴听到您对C#创建自定义控件及添加自定义属性和事件使用实例的详细讲解感兴趣。那么我来为您详细讲解一下。 创建自定义控件 C#允许我们通过继承Control类来创建自定义控件。以下是创建自定义控件的步骤: 新建一个类,并将其继承自Control类。 public class MyCustomControl : Control { // 自定义控件的实现代码…

    C# 2023年6月7日
    00
  • C#泛型接口的协变和逆变

    C#泛型接口的协变和逆变是指能够使泛型对象之间存在子类关系的一种特性,使接口的使用更加灵活方便。在使用泛型接口时,可以使用协变和逆变的特性来增强程序的稳健性和可扩展性。 什么是协变和逆变 在 C# 中,协变和逆变是指参数类型的转换。在泛型接口中,接口定义了必须实现的方法,而协变和逆变则影响了实现这些方法的类的类型关系。 协变:从派生类向基础类转换。也就是说,…

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