C#使用CryptoStream类加密和解密字符串

目录

一、CrytoStream的加密方法

二、CrytoStream的解密方法

三、实例

1.源码Form1.cs

2.类库Encrypt.cs

3.生成效果 


 在使用CryptoStream前要先引用命名空间using System.Security.Cryptography。

一、CrytoStream的加密方法

        记住,不能再使用DESCryptoServiceProvider().CreateEncryptor()创建加密流,因为它已经被微软废弃了。会提示“SYSLIB0021:派生加密类型已过时”,编译也过不去。

        SYSLIB0021 警告 - .NET | Microsoft Learn  

https://learn.microsoft.com/zh-cn/dotnet/fundamentals/syslib-diagnostics/syslib0021

        解决办法:把DESCryptoServiceProvider().CreateEncryptor()替换为DES.Create()。

internal static string ToEncrypt(string encryptKey, string str)
{
    try
    {
        byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey);    //将密钥字符串转换为字节序列
        byte[] byte_data = Encoding.Unicode.GetBytes(str);          //将字符串转换为字节序列     
        using var des = DES.Create();                               //创建加密流对象
        using var memory_stream = new MemoryStream();               //创建内存流对象
        using var crypto_stream = new CryptoStream(memory_stream, des.
            CreateEncryptor(byte_key, byte_key), CryptoStreamMode.Write); //创建加密流对象
        crypto_stream.Write(byte_data, 0, byte_data.Length);        //向加密流中写入字节序列
        crypto_stream.FlushFinalBlock();                            //将数据压入基础流
        crypto_stream.Close();                                      //关闭加密流
        memory_stream.Close();                                      //关闭内存流
        return Convert.ToBase64String(memory_stream.ToArray());     //从内存流中获取并返回加密后的字符串
    }
    catch (CryptographicException ce)
    {
        throw new Exception(ce.Message);
    }
}

二、CrytoStream的解密方法

        与加密方法具有相同的注意事项。

internal static string ToDecrypt(string encryptKey, string str)
{
    try
    {
        byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey);          //将密钥字符串转换为字节序列
        byte[] byte_data = Convert.FromBase64String(str);                                  //将加密后的字符串转换为字节序列
        using var des = DES.Create();                                                                  //创建加密流对象
        using var memory_stream = new MemoryStream(byte_data);            //创建内存流对象并写入数据
        using var crypto_stream = new CryptoStream(memory_stream, des.
            CreateDecryptor(byte_key, byte_key), CryptoStreamMode.Read);  //创建加密流对象
        byte[] bt_temp = new byte[200];                                                             //创建字节序列对象
        MemoryStream memory_stream_temp = new();                          //创建内存流对象
        int i = 0;                                                                                                 //创建记数器
        while ((i = crypto_stream.Read(bt_temp, 0, bt_temp.Length)) > 0)  //使用while循环得到解密数据
        {
            memory_stream_temp.Write(bt_temp, 0, i);                                        //将解密后的数据放入内存流
        }
        crypto_stream.Close();                                                                           //关闭加密流
        memory_stream.Close();                                                                        //关闭内存流
        return Encoding.Unicode.GetString(memory_stream_temp.ToArray());    //方法返回解密后的字符串
    }
    catch (CryptographicException ce)
    {
        throw new Exception(ce.Message);
    }
}

三、实例

        对字符串加密、解密的实例,秘钥=4位数字。

1.源码Form1.cs

// 使用CryptoStream类加密和解密字符串
namespace _046
{
    public partial class Form1 : Form
    {
        private GroupBox? groupBox1;
        private GroupBox? groupBox2;
        private Button? button1;
        private TextBox? textBox3;
        private TextBox? textBox2;
        private TextBox? textBox1;
        private Label? label3;
        private Label? label2;
        private Label? label1;
        private Button? button2;
        private TextBox? textBox6;
        private Label? label4;
        private Label? label5;
        private Label? label6;
        private TextBox? textBox4;
        private TextBox? textBox5;

        public Form1()
        {
            InitializeComponent();
            Load += Form1_Load;
        }
        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(369, 89),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 6,
                Text = "加密",
                UseVisualStyleBackColor = true
            };
            button1.Click += Button1_Click;
            // 
            // textBox3
            //           
            textBox3 = new TextBox
            {
                Location = new Point(12, 136),
                Multiline = true,
                Name = "textBox3",
                Size = new Size(432, 46),
                TabIndex = 5
            };
            // 
            // textBox2
            //          
            textBox2 = new TextBox
            {
                Location = new Point(119, 89),
                Name = "textBox2",
                Size = new Size(244, 23),
                TabIndex = 4
            };
            // 
            // textBox1
            //           
            textBox1 = new TextBox
            {
                Location = new Point(11, 41),
                Multiline = true,
                Name = "textBox1",
                Size = new Size(433, 46),
                TabIndex = 3
            };
            // 
            // label3
            //            
            label3 = new Label
            {
                AutoSize = true,
                Location = new Point(11, 114),
                Name = "label3",
                Size = new Size(92, 17),
                TabIndex = 2,
                Text = "加密后字符串:"
            };
            // 
            // label2
            //            
            label2 = new Label
            {
                AutoSize = true,
                Location = new Point(11, 92),
                Name = "label2",
                Size = new Size(81, 17),
                TabIndex = 1,
                Text = "4bit加密秘钥:"
            };
            // 
            // label1
            //             
            label1 = new Label
            {
                AutoSize = true,
                Location = new Point(11, 19),
                Name = "label1",
                Size = new Size(92, 17),
                TabIndex = 0,
                Text = "加密前字符串:"
            };
            // 
            // groupBox1
            // 
            groupBox1 = new GroupBox
            {
                Location = new Point(12, 12),
                Name = "groupBox1",
                Size = new Size(450, 188),
                TabIndex = 0,
                TabStop = false,
                Text = "加密"
            };
            groupBox1.Controls.Add(button1);
            groupBox1.Controls.Add(textBox3);
            groupBox1.Controls.Add(textBox2);
            groupBox1.Controls.Add(textBox1);
            groupBox1.Controls.Add(label3);
            groupBox1.Controls.Add(label2);
            groupBox1.Controls.Add(label1);
            groupBox1.SuspendLayout();
            // 
            // button2
            //
            button2 = new Button
            {
                Location = new Point(369, 89),
                Name = "button2",
                Size = new Size(75, 23),
                TabIndex = 13,
                Text = "解密",
                UseVisualStyleBackColor = true
            };
            button2.Click += Button2_Click;
            // 
            // textBox6
            //           
            textBox6 = new TextBox
            {
                Location = new Point(12, 136),
                Multiline = true,
                Name = "textBox6",
                Size = new Size(433, 46),
                TabIndex = 12
            };
            // 
            // label4
            //           
            label4 = new Label
            {
                AutoSize = true,
                Location = new Point(12, 19),
                Name = "label4",
                Size = new Size(92, 17),
                TabIndex = 7,
                Text = "解密前字符串:"
            };
            // 
            // label5
            //            
            label5 = new Label
            {
                AutoSize = true,
                Location = new Point(12, 92),
                Name = "label5",
                Size = new Size(90, 17),
                TabIndex = 8,
                Text = "4bit解密密钥:"
            };
            // 
            // label6
            //           
            label6 = new Label
            {
                AutoSize = true,
                Location = new Point(12, 114),
                Name = "label6",
                Size = new Size(92, 17),
                TabIndex = 9,
                Text = "解密后字符串:"
            };
            // 
            // textBox4
            //          
            textBox4 = new TextBox
            {
                Location = new Point(12, 41),
                Multiline = true,
                Name = "textBox4",
                Size = new Size(432, 46),
                TabIndex = 10
            };
            // 
            // textBox5
            //           
            textBox5 = new TextBox
            {
                Location = new Point(119, 89),
                Name = "textBox5",
                Size = new Size(244, 23),
                TabIndex = 11
            };
            // 
            // groupBox2
            // 
            groupBox2 = new GroupBox
            {
                Location = new Point(12, 206),
                Name = "groupBox2",
                Size = new Size(450, 188),
                TabIndex = 0,
                TabStop = false,
                Text = "解密"
            };
            groupBox2.Controls.Add(button2);
            groupBox2.Controls.Add(textBox6);
            groupBox2.Controls.Add(label4);
            groupBox2.Controls.Add(label5);
            groupBox2.Controls.Add(label6);
            groupBox2.Controls.Add(textBox4);
            groupBox2.Controls.Add(textBox5);
            groupBox2.SuspendLayout();

            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(474, 406);
            Controls.Add(groupBox2);
            Controls.Add(groupBox1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "用CryptoStream类加密和解密字符串";
            groupBox1.ResumeLayout(false);
            groupBox1.PerformLayout();
            groupBox2.ResumeLayout(false);
            groupBox2.PerformLayout();
            ResumeLayout(false);
        }

        private void Button1_Click(object? sender, EventArgs e)
        {
            if (textBox2!.Text.Length == 4)    //判断加密密钥长度是否正确
            {
                try
                {
                    textBox3!.Text =           //调用实例ToEncrypt方法得到加密后的字符串
                        Encrypt.ToEncrypt(textBox2.Text, textBox1!.Text);
                }
                catch (Exception ex)            //捕获异常
                {
                    MessageBox.Show(ex.Message);//输出异常信息
                }
            }
            else
            {
                MessageBox.Show("密钥长度不符!", "提示");//提示用户输入密钥长度不正确
            }
        }

        private void Button2_Click(object? sender, EventArgs e)
        {
            if (textBox5!.Text.Length == 4)       //判断加密密钥长度是否正确
            {
                try
                {
                    textBox6!.Text =              //调用ToDecrypt方法得到解密后的字符串
                        Encrypt.ToDecrypt(textBox5.Text, textBox4!.Text);
                }
                catch (Exception ex)              //捕获异常
                {
                    MessageBox.Show(ex.Message);  //输出异常信息
                }
            }
            else
            {
                MessageBox.Show("密钥长度不符!", "提示");//提示用户输入密钥长度不正确
            }
        }
    }
}

2.类库Encrypt.cs

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

namespace _046
{
    internal class Encrypt
    {
        internal static string ToEncrypt(string encryptKey, string str)
        {
            try
            {
                byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey);//将密钥字符串转换为字节序列
                byte[] byte_data = Encoding.Unicode.GetBytes(str);      //将字符串转换为字节序列     
                using var des = DES.Create();                           //创建加密流对象                                                
                using var memory_stream = new MemoryStream();           //创建内存流对象
                using var crypto_stream = new CryptoStream(memory_stream, des.
                    CreateEncryptor(byte_key, byte_key), CryptoStreamMode.Write); //创建加密流对象
                crypto_stream.Write(byte_data, 0, byte_data.Length);    //向加密流中写入字节序列
                crypto_stream.FlushFinalBlock();                        //将数据压入基础流                                            
                crypto_stream.Close();                                  //关闭加密流                                                         
                memory_stream.Close();                                  //关闭内存流                                                     
                return Convert.ToBase64String(memory_stream.ToArray()); //从内存流中获取并返回加密后的字符串
            }
            catch (CryptographicException ce)
            {
                throw new Exception(ce.Message);
            }
        }

        internal static string ToDecrypt(string encryptKey, string str)
        {
            try
            {
                byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey); //将密钥字符串转换为字节序列                  
                byte[] byte_data = Convert.FromBase64String(str);        //将加密后的字符串转换为字节序列                                  
                using var des = DES.Create();                            //创建加密流对象                                                                  
                using var memory_stream = new MemoryStream(byte_data);   //创建内存流对象并写入数据                  
                using var crypto_stream = new CryptoStream(memory_stream, des.
                    CreateDecryptor(byte_key, byte_key), CryptoStreamMode.Read);//创建加密流对象        
                byte[] bt_temp = new byte[200];             //创建字节序列对象                                                             
                MemoryStream memory_stream_temp = new();    //创建内存流对象                                     
                int i = 0;                                  //创建记数器                                                                                                 
                while ((i = crypto_stream.Read(bt_temp, 0, bt_temp.Length)) > 0)//使用while循环得到解密数据           
                {
                    memory_stream_temp.Write(bt_temp, 0, i);//将解密后的数据放入内存流                                        
                }
                crypto_stream.Close();                       //关闭加密流                                                                           
                memory_stream.Close();                       //关闭内存流                                                                       
                return Encoding.Unicode.GetString(memory_stream_temp.ToArray());//方法返回解密后的字符串
            }
            catch (CryptographicException ce)
            {
                throw new Exception(ce.Message);
            }
        }
    }
}

3.生成效果 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/313085.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷粒学院项目redirect_uri 参数错误微信二维码登录

谷粒学院项目redirect_uri 参数错误_redirect_uri": "http%3a%2f%2fguli.shop%2fapi%2fuce-CSDN博客 修改本地配置 # ����˿� server.port8160 # ����&#x…

我的隐私计算学习——联邦学习(3)

本篇笔记主要是根据这位老师的知识分享整理而成【公众号:秃顶的码农】,我从他的资料里学到了很多,期间还私信询问了一些困惑,都得到了老师详细的答复,相当nice! (五)纵向联邦学习 —…

网络多线程开发小项目--QQ登陆聊天功能(发文件)

9.1.5、QQ登陆聊天功能(发文件) 1、需求分析 2、思路分析 3、代码实现 Common: 1) cn.com.agree.qqcommon.MessageType String MESSAGE_FILE_MESSAGE"8";//文件消息2) cn.com.agree.qqcommon.Message private byte[] fileBytes ;private i…

八、Stm32学习-USART-中断与接收数据包

1.通信接口 全双工就是数据的收和发可以同时进行;半双工就是数据的收和发不能同时进行。 异步时钟是设备双方需要约定对应的波特率;同步时钟是设备双方有一根时钟线,发送或接收数据是根据这根时钟线来的。 单端电平是需要共GND;…

2023 年最值得推荐的11个视频转换器(免费和付费)

拥有一个视频转换器供您使用意味着您可以轻松地在任何设备上播放所有视频。我们展示了适用于 Windows 的最佳视频转换器,这样您就不必浪费时间使用不合格的工具。 录制、编辑和分享视频是人生最大的消遣之一。有如此多的设备能够捕捉视频——而且共享它们的途径也很…

【Git】查看凭据管理器的账号信息,并删除账号,解决首次认证登录失败后无法重新登录的问题

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是是《代码管理工具》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的…

Python编程作业一:程序基本流程

目录 一、多分支语句 二、判断闰年 三、猴子吃桃问题 四、上/下三角形乘法表 五、猜数字游戏 一、多分支语句 某商店出售某品牌的服装,每件定价132元,1件不打折,2件(含)到3件(含)打9折&…

可拖拽表单比传统表单好在哪里?

随着行业的进步和发展,可拖拽表单的应用价值越来越高,在推动企业实现流程化办公和数字化转型的过程中发挥了重要价值和作用,是提质增效的办公利器,也是众多行业客户朋友理想的合作伙伴。那么,可拖拽表单的优势特点表单…

【时光记:2023的心灵旅程】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ARM Cortex-Mx 权威指南笔记—SysTick定时器

前言 通过本次学习你可以学到: 1、什么是SysTick定时器? 2、Systick定时器的操作。 3、如何使用Systick定时器。 正文内容参考 ARM Cortex-Mx 权威指南笔记 9.5小节。 什么是Systick定时器 SysTick定时器是Cortex-M处理器内部集成的名为系统节拍定时…

【python,机器学习,nlp】RNN循环神经网络

RNN(Recurrent Neural Network),中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出。 因为RNN结构能够很好利用序列之间的关系,因此针对自…

电位器

一、电位器简介 电位器是一种可调的电子元件。它是由一个电阻体和一个转动或滑动系统组成。当电阻体的两个固定触电之间外加一个电压时,通过转动或滑动系统改变触点在电阻体上的位置,在动触点与固定触点之间便可得到一个与动触点位置成一定关系的电压。…

C++系列-第1章顺序结构-6-加法、减法和乘法

在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客,主要讲述加法减法乘法的用法 加法 减法 乘法 当然可以。下面我将分别为初一的同学提供C中加法、减法、乘法的简单教程和案例,最后再提供一个综合性的…

【Linux驱动】Linux的中断系统 | 中断的重要数据结构

🐱作者:一只大喵咪1201 🐱专栏:《Linux驱动》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀Linux系统的中断⚽中断分类软中断和硬中断中断的上半部和下半部 ⚽tasklet⚽工…

Android studio调试

Android Studio连接手机详细教程(包含遇到的问题集)_android studio 连接手机-CSDN博客 可以创建虚拟机或直连真机或直连模拟器。 无法打开本地终端 Android studio Failed to start [powershell.exe] 利用Android studio的adb命令删除app应用 - 简书 利用ADB工具免root停用A…

如何下载 DEM数字高程数据(SRTM和COPERNICUS)

数字高程模型(Digital Elevation Model,DEM)是地球表面的数字表示,以地形高程信息的形式存在。DEM通常以栅格或点云的形式存在,其中每个单元(栅格或点)都具有对应的高程数值。DEM可以使用各种技…

第88讲:XtraBackup实现增量数据备份以及故障恢复的应用实践

文章目录 1.XtraBackup增量备份恢复的概念2.XBK增量备份语法3.使用XBK实现数据库的增量备份3.1.周日全量备份数据库3.2.周一产生增量数据并进行增量备份3.3.周二产生增量数据并进行增量备份3.4.查看两次增量以及全量的备份文件3.5.核对全量和增量备份的准确性 4.使用XBK通过增量…

销售团队如何实现业绩增长?CRM系统的线索管理功能有什么用?

随着“以客户为中心”观念的逐渐普及,销售团队的客户比过去更复杂,交易周期更久,竞争也更激烈。假如没有明确的销售计划,团队可能陷入混乱,最后导致客户&公司之间的负面结果。在这种情况下,人工智能驱动…

YOLOv8 损失函数改进 | 引入 Shape-IoU 考虑边框形状与尺度的度量

🗝️改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制 论文讲解加入代码本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者可以获取到注意力加入的代码和使用经验,总…

npm报错error:03000086:digital envelope routines::initialization error

1.可能是因为node版本过高,与现在的项目不符合 这是降低node版本的命令,然后重新运行 npm install npm8.1.2 -g 2.改下这个package.json "dev": "SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve",也…