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

news2024/11/16 4:52:44

目录

一、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.coloradmin.cn/o/1376856.html

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

相关文章

宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新

来源:宏集科技 工业物联网 宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新 原文链接:https://mp.weixin.qq.com/s/DwzVzifUiidNr-FT3Zfzpg 欢迎关注虹科,为您提供最新资讯! 01 前言 近年来,中国食品行业…

深入浅出Android dmabuf_dump工具

目录 dmabuf是什么? dmabuf_dump工具介绍(基于Android 14) Android.bp dmabuf_dump.cpp 整体架构结构如下 dmabuf_dump主要包含以下功能 前置背景知识 fdinfo 思考 bufinfo Dump整个手机系统的dmabuf Dump某个进程的dmabuf​​​​​​​ 以Table[buff…

Hive 的 安装与使用

目录 1 安装 MySql2 安装 Hive3 Hive 元数据配置到 MySql4 启动 Hive5 Hive 常用交互命令6 Hive 常见属性配置 Hive 官网 1 安装 MySql 为什么需要安装 MySql? 原因在于Hive 默认使用的元数据库为 derby,开启 Hive 之后就会占用元数据库,且不与其他客户…

Windows 远程控制之 PsExec

1、介绍: PsExec 是一种轻量级 telnet 替代品,可让你在其他系统上执行进程,并为控制台应用程序提供完整交互性,而无需手动安装客户端软件。 PsExec 最强大的用途包括在远程系统上启动交互式命令提示符,以及 IpConfig …

一篇文章彻底搞懂TiDB集群各种容量计算方式

背景 TiDB 集群的监控面板里面有两个非常重要、且非常常用的指标,相信用了 TiDB 的都见过: Storage capacity:集群的总容量 Current storage size:集群当前已经使用的空间大小 当你准备了一堆服务器,经过各种思考设计…

【JaveWeb教程】(21) MySQL数据库开发之多表设计:一对多、一对一、多对多的表关系 详细代码示例讲解

目录 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案例 2. 多表设计 关于单表的操作(单表的设计、单表的增删改查)我们就已经学习完了。接下来我们就要来学习多表的操作,首先来学习多表的设计。 项目开发中,在进行数据库…

OCR字符识别:开始批量识别身份证信息

身份证信息批量识别OCR是一项解决方案,它能够将身份证照片打包成zip格式或通过URL地址进行提交,并能够识别照片中的文本信息。最终,用户可以将识别结果生成为excel文件进行下载。 API接口功能: 1. 批量识别:支持将多…

SPDK中常用的性能测试工具

本文主要介绍磁盘性能评估的方法,针对用户态驱动Kernel与SPDK中各种IO测试工具的使用方法做出总结。其中fio是一个常用的IO测试工具,可以运行在Linux、Windows等多种系统之上,可以用来测试本地磁盘、网络存储等的性能。为了和SPDK的fio工具相…

大模型学习与实践笔记(四)

一、大模型开发范式 RAG(Retrieval Augmented Generation)检索增强生成,即大模型LLM在回答问题或生成文本时,会先从大量的文档中检索出相关信息,然后基于这些检索出的信息进行回答或生成文本,从而可以提高回…

Prepar3D设置全屏显示设置方法

一、 基础设置 当视景软件显示的屏幕超过一个的时候,需要将多个显示屏幕在设置->屏幕设置->多显示器这里设置为扩展这些显示器。 二、全屏方法说明 一般情况只需要设置了多屏显示扩展并设置了P3D软件全屏设置(即下面的步骤一)保存后…

D2576 DC-DC降压芯片用于直流充电桩,具备3A的输出电流能力,输入电压6~40VDC

随着新能源汽车的不断普及,如何解决新能源车充电的问题也成为大热话题,充电桩的数量与质量也是目前急需提升的热门方面,现阶段人们需要的充电桩主要有交流充电桩和直流充电桩,直流充电桩因其节能效率高、功率因数高、充电快、逐渐…

【OJ比赛日历】快周末了,不来一场比赛吗? #01.13-01.19 #11场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2024-01-13(周六) #4场比赛2024-01-14…

【一、测试基础】Java基础语法

Java 的用法及注意事项有很多,今天的目标是了解Java基础语法,且能够输出"hello world" 几个基础的概念 对象:对象是类的一个实例,有状态和行为。一只猫是一个对象,猫的状态有:颜色、名字、品种&…

通信原理 | 累积谱的概念 | Python案例代码介讲解

文章目录 累积谱的概念Python案例代码讲解结果展示拓展累积幅值什么意思累积谱的概念 累积谱(Cumulative Spectrum)是信号处理领域的一个概念,它用于描述信号的频谱分布。具体来说,累积谱是一个函数或者图表,用来表示信号频谱中的能量分布,通常是从最低频率开始累积到某…

AI智能分析网关V4:太阳能+4G智慧水库远程可视化智能监管方案

一、背景需求分析 由于水库位置分散的原因,水库视频监控建设在立杆、布线等方面都存在一定的难度,且需要人力、物力的前期投入和后期维护。目前水库的监管存在一定的问题,管理人员工作强度大但管理质量并不高,人为巡检无法实时发…

C# OpenCvSharp DNN 部署yoloX

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN 部署yoloX 效果 模型信息 Inputs ------------------------- name:images tensor:Float[1, 3, 640, 640] --------------------------------------------------------------- Outputs ---…

Java异常处理--异常处理的方式1

文章目录 一、异常处理概述二、方式1:捕获异常(try-catch-finally)(1)抓抛模型(2)try-catch-finally基本格式1、基本语法2、整体执行过程3、try和catch3.1 try3.2 catch (Exceptiontype e) &…

系列二、Spring Security中的核心类

一、Spring Security中的核心类 1.1、自动配置类 UserDetailsServiceAutoConfiguration 1.2、密码加密器 1.2.1、概述 Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数&a…

element-ui 如何修改el-popconfirm的样式

改造之前效果 改造之后效果 代码&#xff1a; <style lang"scss"> .my-popconfirm {width: 92% !important;height: 130px !important;padding: 14px !important;font-size: 28px !important;.el-popper {font-size: 28px !important;}.el-popconfirm__main {…

ChatGPT:人工智能与人类交流的桥梁

在人工智能的浪潮中&#xff0c;ChatGPT以其独特的交流能力成为了一个亮点。作为一个基于强大的GPT-4模型的聊天机器人&#xff0c;ChatGPT不仅仅是技术的展示&#xff0c;它更是人工智能与人类交流的桥梁。 人工智能的语言理解革命 ChatGPT的出现标志着人工智能在语言理解和…