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日

相关文章

  • MVC使用T4模板生成其他类的具体实现学习笔记2

    下面是“MVC使用T4模板生成其他类的具体实现学习笔记2”的完整攻略: 1. 什么是T4模板 T4模板(Text Template Transformation Toolkit)是Visual Studio内置的代码生成引擎,可以将一些模板文件转换为其它类型的文件,例如:.cs、.vb等文件。 2. 如何生成MVC中的控制器和视图 2.1 在 Visual …

    C# 2023年6月3日
    00
  • 聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题 1. 接口究竟是什么? 在C#中,接口(interface)是一种定义了一组方法、属性和事件的规范 (specification),但没有提供实现代码的一种类型。接口可以被类或结构(struct)实现,实现接口的类或结构需要实现接口中定义的所有成员,并且成员的访问级别不能低于接口的访问级别。 2. 接口的作用 接口主要有以下两个作用: 定…

    C# 2023年6月6日
    00
  • C# 实现连连看功能(推荐)

    C# 实现连连看功能(推荐) 引言 连连看是一种受欢迎的游戏,早期多出现在各种小游戏网站和手机应用中。连连看的功能算法也较为复杂,本文将使用C#编程语言来实现连连看功能,供各位开发者参考。 分析 连连看的主要逻辑是,选择两个相同的图片,并且图片之间的连接线条不超过三条,即可消除这两个图片。为了实现这个功能,需要按照以下步骤来进行操作: 搭建界面 加载图片资源…

    C# 2023年6月6日
    00
  • C#之继承实现

    C#之继承实现 什么是继承 继承是一种面向对象编程的基本特征,是指在一个类的基础上创建新类,新类具有原来类的特征(属性和方法),同时还能增加自己的特性。 通过继承,可以使代码的复用性大大提高,同时使得代码的管理和维护更方便。 在C#语言中,继承是通过使用关键字“:`”来实现的,子类继承父类。 继承的基本语法 class 子类名 : 父类名 { // 子类特有…

    C# 2023年6月6日
    00
  • C#使用HtmlAgilityPack组件解析html文档

    下面是详细的“C#使用HtmlAgilityPack组件解析html文档”的攻略: 一、为什么选择HtmlAgilityPack组件 在C#中,我们可以使用各种各样的组件来解析HTML文档,但是HtmlAgilityPack组件一直是最流行的组件之一。使用HtmlAgilityPack,我们可以轻松地遍历和操作HTML文档,因为它提供了非常方便的API和方法…

    C# 2023年5月31日
    00
  • JavaScript 2018 中即将迎来的新功能

    下面是对于JavaScript 2018即将迎来的新功能的详细讲解攻略。 异步迭代器 异步迭代器是 JavaScript 2018 中新增的一个比较重要的功能,这一功能可以让 Web 开发变得更加简单和高效,它的特点是可以同时迭代多个异步对象,实现对它们的并发处理。在之前的版本中,迭代器只支持同步迭代,异步操作如果要迭代需要使用 Generator 或回调函…

    C# 2023年6月8日
    00
  • .NET数组使用中的注意事项小结

    .NET数组使用中的注意事项小结 1. 数组基本介绍 在.NET中,数组是一种最常用的数据结构之一。数组是具有一定顺序关系的数据集合,可以使用整数作为下标(索引)访问数组中的元素。在使用数组时,需要注意以下几个点: 数组元素类型 数组长度 数组下标 数组越界 2. 数组元素类型 数组元素的类型可以是基本数据类型,也可以是引用类型。常见的基本数据类型有int、…

    C# 2023年6月7日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)

    在前两篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) 我们对.netcore部署到linux有了一个充分的了解,已经可以满足应用要求了,这篇文章我们继续深入带你了解使用Doker+jexus或Nginx来部署.net co…

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