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.生成效果 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DrGraph原理示教 - OpenCV 4 功能 - 边界填充

今天简单来看一下OpenCV中的边界填充 param src Source image. param dst Destination image of the same type as src and the size Size(src.colsleftright, src.rowstopbottom) . param top the top pixels param bottom the bottom pixels param left the left pixels par…

Photoshop 2024 (PS2024) v25 直装版 支持win/mac版

Photoshop 2024 提供了多种创意工具,如画笔、铅笔、涂鸦和渐变等,用户可以通过这些工具来创建独特和令人印象深刻的设计效果。增强的云同步:通过 Adobe Creative Cloud,用户可以方便地将他们的工作从一个设备无缝同步到另一个设备…

STM32L051使用HAL库操作实例(14)- ADC采集电压

目录 一、前言 二、ADC外设简要说明 三、STM32CubeMX配置(本文使用的STM32CubeMX版本为6.1.2) 1.MCU选型 2.时钟使能 3.外部时钟配置 4.串口配置 5.ADC引脚配置 6.配置STM32CubeMX生成工程文件 7.点击GENERATE CODE生成工程文件 四、工程源码 …

Python基础知识:整理13 利用pyecharts生成折线图

首先需要安装第三方包pyecharts 1 基础折线图 # 导包,导入Line功能构建折线图对象 from pyecharts.charts import Line # 折线图 from pyecharts.options import TitleOpts # 标题 from pyecharts.options import LegendOpts # 图例 from pyecharts.options im…

mp4文件全部转换为mp3

问题 今天突发奇想,想把mp4视频转换为mp3来收听,于是想到了ffmpeg工具 步骤 安装ffmpeg环境 要在 Windows 上配置 FFmpeg 环境,你可以按照以下步骤进行操作: 下载 FFmpeg: 首先,你需要下载 FFmpeg 的 W…

一个成功的camera案例:ros2+gazebo+摄像头

各位看:随着大物体的移动,在涉嫌头的位置也发生了改变-----右上角那个/camera的位置也变了 右上角那个是摄像头图案,以下是仓库链接: ros-ign-gazebo-camera: https://github.com/arashsm79/ros-ign-gazebo-camera.git一个ros2摄…

初识物联网

1:什么是IOT: 物联网的英文名称是Internet of Things。IoT则是Internet of Things的缩写。因此, 物联网 IoT。 通俗地说,物联网是互联网的一种拓展。我们知道互联网是由无数的计算机和智能手机交错连接而编织成的一张网。而正是有了像NodeM…

Spring Cloud + Vue前后端分离-第12章 通用权限设计

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第12章 通用权限设计 这一章我们不依赖第三方框架,我会从权限相关表的设计,到权限的配置,到权限的拦截,带大家一步一步的做出…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑新能源配网三相不平衡治理的电动汽车充电策略》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题表明研究着重于开发一种电动汽车充电策略,该策略考虑了在新能源配电网络中存在的三相不平衡问题。解读如下: 电动汽车充…

Typora上传图片失败PicGo

起初我是在Typora中点击一键上传图片,结果如下,报错。可是我找了半天也没错啊。 最后发现原来是一个图片的命名问题,名字太过于复杂,PicGo识别不出,一个图片报错导致其它也上传不了。 我把它复制到其它文件夹之后&…

【QUARTZ】springboot+quartz动态配置定时任务

Quartz 介绍 Quartz 定时任务可分为Trigger(触发器)、Job(任务)和Scheduler(调度器),定时任务的逻辑大体为:创建触发器和任务,并将其加入到调度器中,如下图所…

webpack原理和逆向实战

文章目录 什么是webpackwebpack基本原理webpack代码分析webpack代码抠取webpack全模块自吐webpack自动扣取总结 什么是webpack webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler),负责分析翻译压缩打包代码。 上面的官网的一张示例图。 web…

大数据实时抓取软件:Maxwell学习网站的高效框架!

介绍:Maxwell是由美国Zendesk开源的,使用Java编写的MySQL实时抓取软件。它能够实时读取MySQL的二进制日志(Binlog),并将这些信息生成为JSON格式的消息。进一步地,Maxwell将这些消息作为生产者发送给Kafka、…

Springboot项目Nacos做配置中心

Springboot项目Nacos做配置中心 说明安装2.Springboot整合使用Nacos3.问题处理 说明 文档参考 Nacos Spring Boot 安装 查看nacos镜像 docker search nacos 下载镜像 docker pull nacos/nacos-server启动naocs镜像 docker run --env MODEstandalone --name nacos -d -p 8…

Abaqus2023安装下载教程

用钢铁意志,成就不平凡的人生。 今天博主整理了一下Abaqus2023安装下载教程,希望大家学习。 安装之前请关闭电脑所有杀毒软件和防火墙,并保证计算机名不是中文!!!! 1.首先创建一个用于Abaqus…

【Linux】进程程序替换

👑作者主页:@安 度 因 🏠学习社区:安度因 📖专栏链接:Linux 文章目录 简单看看程序替换原理(单进程)多进程进程程序替换补充exec 系列进程创建时有两个目标: 执行父进程的部分代码,由自己编写的,通过 if else 分流,让子进程执行的对应任务。执行和父进程完全不同…

Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?

这几个问题是Linux操作的入门问题,但是确实也会让刚上手Linux小伙伴头疼一阵,故特有此文,希望能对刚入门的小伙伴有一些帮助~ 众所周知 在linux上在线安装软件需要用到yum命令,经常下述命令来安装 yum install [-y] 包名 #-y的…

Hive基础知识(十二):Hive的基本查询

1. 全表和特定列查询 0)数据准备 原始数据 dept: 10 ACCOUNTING 1700 20 RESEARCH 1800 30 SALES 1900 40 OPERATIONS 1700 emp: 7369 SMITH CLERK 7902 1980-12-17 800.00 20 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 7521 WARD SALESM…

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)五

第三部分、栈(Stack)和队列(Queue)详解 栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解。 使用栈…

Java Swing 图书借阅系统 窗体项目 期末课程设计 窗体设计

视频教程: 【课程设计】图书借阅系统 功能描述: 图书管理系统有三个角色,系统管理员、图书管理员、借阅者; 系统管理员可以添加借阅用户; ​图书管理员可以添加图书,操作图书借阅和归还; 借…