C# 关于加密技术以及应用(一)

在 开发过程中,加密是一个常见的需求,数字签名和验证、网络通信安全、数据加密解密、用于保护数据的安全性和隐私。如几种常用的加密技术AES、SSL/TLS、RSA、HMAC 、SHA等,都是我们开发过程中常用到的加密方式,只不过每一个加密方式都有自己的特长。
下面就逐个讲一下

1. AES (Advanced Encryption Standard)

AES 是一种对称加密算法,广泛用于数据加密和解密。在 C# 中,可以使用 System.Security.Cryptography.Aes 类来实现 AES 加密和解密。

示例代码

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;public class AesEncryption
{public static byte[] EncryptStringToBytes_Aes(string plainText, byte[] key, byte[] iv){//创建加密器 encryptorusing (Aes aesAlg = Aes.Create()){aesAlg.Key = key;aesAlg.IV = iv;//创建加密器 encryptorICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);//使用 MemoryStream 和 CryptoStream 进行加密操作。using (MemoryStream msEncrypt = new MemoryStream()){using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)){//将明文写入 StreamWriter,并通过 CryptoStream 进行加密。using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)){swEncrypt.Write(plainText);}}return msEncrypt.ToArray();}}}///cipherText: 需要解密的密文字节数组。///key: 解密密钥。///iv: 初始化向量(IV)。public static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] key, byte[] iv){//•	使用 Aes.Create() 创建一个 AES 对象。using (Aes aesAlg = Aes.Create()){//设置 AES 对象的密钥和初始化向量aesAlg.Key = key;aesAlg.IV = iv;//创建解密器 decryptor。ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);//使用 MemoryStream 和 CryptoStream 进行解密操作using (MemoryStream msDecrypt = new MemoryStream(cipherText)){using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)){//将密文读取到 StreamReader,并通过 CryptoStream 进行解密。using (StreamReader srDecrypt = new StreamReader(csDecrypt)){return srDecrypt.ReadToEnd();}}}}}public static void Main(){string original = "Hello, World!";byte[] key = new byte[32]; // 256-bit keybyte[] iv = new byte[16];  // 128-bit IVusing (RandomNumberGenerator rng = RandomNumberGenerator.Create()){rng.GetBytes(key);rng.GetBytes(iv);}byte[] encrypted = EncryptStringToBytes_Aes(original, key, iv);string decrypted = DecryptStringFromBytes_Aes(encrypted, key, iv);//•	输出原始字符串、加密后的数据(Base64 编码)和解密后的字符串。Console.WriteLine("Original: {0}", original);Console.WriteLine("Encrypted: {0}", Convert.ToBase64String(encrypted));Console.WriteLine("Decrypted: {0}", decrypted);}
}

这段代码展示了如何使用 AES 算法进行字符串的加密和解密。通过 AesEncryption 类中的 EncryptStringToBytes_Aes 和 DecryptStringFromBytes_Aes 方法,可以方便地对字符串进行加密和解密操作。
主方法 Main 演示了整个加密和解密的过程

2. SSL/TLS (Secure Sockets Layer / Transport Layer Security)

SSL/TLS 用于在网络通信中提供安全连接。可以使用 System.Net.Http.HttpClient 类来实现 HTTPS 请求,自动处理 SSL/TLS 协议。

示例代码

using System;
using System.Net.Http;
using System.Threading.Tasks;public class HttpsExample
{public static async Task Main(){using (HttpClient client = new HttpClient()){try{HttpResponseMessage response = await client.GetAsync("https://api.example.com/data");response.EnsureSuccessStatusCode();string responseBody = await response.Content.ReadAsStringAsync();Console.WriteLine(responseBody);}catch (HttpRequestException e){Console.WriteLine($"Request error: {e.Message}");}}}
}

3. RSA (Rivest-Shamir-Adleman)

RSA 是一种非对称加密算法,常用于数字签名和密钥交换。使用 System.Security.Cryptography.RSA 类来实现 RSA 加密和解密。

示例代码

using System;
using System.Security.Cryptography;
using System.Text;public class RsaEncryption
{public static string EncryptStringToRsa(string plainText, RSAParameters publicKey){using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()){rsa.ImportParameters(publicKey);byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);byte[] encryptedBytes = rsa.Encrypt(plainBytes, false);return Convert.ToBase64String(encryptedBytes);}}public static string DecryptStringFromRsa(string cipherText, RSAParameters privateKey){using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()){rsa.ImportParameters(privateKey);byte[] cipherBytes = Convert.FromBase64String(cipherText);byte[] plainBytes = rsa.Decrypt(cipherBytes, false);return Encoding.UTF8.GetString(plainBytes);}}public static void Main(){string original = "Hello, World!";using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()){RSAParameters publicKey = rsa.ExportParameters(false);RSAParameters privateKey = rsa.ExportParameters(true);string encrypted = EncryptStringToRsa(original, publicKey);string decrypted = DecryptStringFromRsa(encrypted, privateKey);Console.WriteLine("Original: {0}", original);Console.WriteLine("Encrypted: {0}", encrypted);Console.WriteLine("Decrypted: {0}", decrypted);}}
}

4. HMAC (Hash-based Message Authentication Code)

HMAC 是一种基于哈希函数的消息认证码,用于验证数据完整性和来源。使用 System.Security.Cryptography.HMACSHA256 类来实现 HMAC。

示例代码

using System;
using System.Security.Cryptography;
using System.Text;public class HmacExample
{public static string ComputeHmacSha256(string message, string secret){using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret))){byte[] hashMessage = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));return BitConverter.ToString(hashMessage).Replace("-", "").ToLower();}}public static void Main(){string message = "Hello, World!";string secret = "mysecretkey";string hmac = ComputeHmacSha256(message, secret);Console.WriteLine("Message: {0}", message);Console.WriteLine("Secret: {0}", secret);Console.WriteLine("HMAC: {0}", hmac);}
}

5. SHA (Secure Hash Algorithm)

SHA 是一种哈希函数,用于生成固定长度的哈希值。在 C# 中,可以使用 System.Security.Cryptography.SHA256 类来实现 SHA-256 哈希。

示例代码

using System;
using System.Security.Cryptography;
using System.Text;public class Sha256Example
{public static string ComputeSha256Hash(string input){using (SHA256 sha256 = SHA256.Create()){byte[] inputBytes = Encoding.UTF8.GetBytes(input);byte[] hashBytes = sha256.ComputeHash(inputBytes);StringBuilder sb = new StringBuilder();foreach (byte b in hashBytes){sb.Append(b.ToString("x2"));}return sb.ToString();}}public static void Main(){string input = "Hello, World!";string hash = ComputeSha256Hash(input);Console.WriteLine("Input: {0}", input);Console.WriteLine("SHA-256 Hash: {0}", hash);}
}

总结

以上是几种常用的加密技术和相应的示例。具体需求可以选择合适的加密算法来保护数据的安全性和隐私(着重讲解RSA与AES的使用,见下一章节)

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

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

相关文章

Python 爬虫 (1)基础 | XHR

一、XHR 1、概念 XHR,全称XMLHttpRequest,是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它允许网页的JavaScript代码与服务器进行异步通信,即在发送请求后,浏览器不会阻塞用户的后续操作&#xff0…

二进制部署Prometheus+grafana+alertmanager+node_exporter

Prometheus 是一个开源的监控和告警工具包,旨在提供高可靠性和可扩展性。它最初由 SoundCloud 开发,现已成为云原生计算基金会(CNCF)的一部分。以下是 Prometheus 的一些关键特性和概念: 1. **时间序列数据库**&#…

工业智能网关如何为企业实现智能制造赋能?

在数字化转型的浪潮中,工业智能网关作为连接物理世界与数字世界的桥梁,正逐步成为智能制造领域的核心组件。本文将通过一个实际使用案例,深入剖析工业智能网关如何助力企业实现生产流程的优化、数据的高效采集与分析,以及智能化决…

算法设计6_随机化算法

随机化算法 随机算法的随机性(基本特征) – 对于同一实例的多次执行, 效果可能完全不同 – 时间复杂性的一个随机变量 – 解的正确性和准确性也是随机的 数值随机化算法 随机数值算法 – 主要用于数值问题求解 – 算法的输出往往是近似解 – 近似…

使用mmdeploy框架C++预测mask并绘制最小外接矩形

目录 解决目标 逻辑思路 代码实现 第1部分 第2部分 解决目标 这段代码实现了,一个基于深度学习的图像检测程序。它使用mmdeploy框架,加载一个预训练的模型【实例分割模型】来检测图像中的物体。 逻辑思路 程序首先加载模型,然后&#…

Java --- JVM编译运行过程

目录 一.Java编译与执行流程: 二.编译过程: 1.编译器(javac): 2.字节码文件(.class): 三.执行过程: 1.启动JVM(Java虚拟机): 2…

【Makefile】编译日志之输出重定向符号 >

用法1 make all >& compilelog.txt make all > compilelog.txt这两个编译命令在功能上有一些细微的区别,主要在于标准输出和标准错误的处理方式。 make all >& compilelog.txt 这个命令会将标准输出(stdout)和标准错误&a…

使用 `typing_extensions.TypeAlias` 简化类型定义:初学者指南

使用 typing_extensions.TypeAlias 简化类型定义:初学者指南 什么是 TypeAlias?安装 typing_extensions示例代码:如何使用 TypeAlias示例 1:为简单类型定义别名示例 2:为复杂类型定义别名示例 3:结合 Union…

11.关于vim编辑器的简单配置

1. 说明 在linux系统中编辑文件内容的方式有很多种,比如直接在系统中暗中某些IDE,方便快捷,也可以直接在windows系统中编辑好文件后上传到linux系统中,这些方式对于编写内容较多的文件或者整个项目的文件还是非常适合的。不过有时…

qq空间管理小助手教程代码演示

headers {"Authorization": "Bearer YOUR_ACCESS_TOKEN","Content-Type": "application/json" }# 发布说说示例( def post_moment(content):url "https://qzone-api.example.com/post_moment"data {"con…

pytest 的简单介绍

官方文档:pytest 文档 1. pytest 概述 pytest 是一个功能强大的 Python 测试框架,旨在简化单元测试和功能测试的编写与执行。它不仅支持简单的单元测试,还能进行更复杂的测试,如数据驱动的测试、并发测试等。pytest 支持自动化发…

【ArcGIS微课1000例】0133:二维建筑物依据高度生成三维模型

拓展阅读:【ArcGIS Pro微课1000例】0032:创建具有指定高程Z值的矢量数据 文章目录 一、二维面要素拉伸实现三维显示二、依据高度实现要素转3D一、二维面要素拉伸实现三维显示 打开ArcScene软件,加载实验配套数据0133.rar中的建筑物.shp数据,如下图: 数据属性表中的Z为建筑…

快速搭建SpringBoot3+Vue3+ElementPlus管理系统

快速搭建SpringBoot3Vue3管理系统 前端项目搭建(默认开发环境:node20,Jdk17)创建项目并下载依赖--执行以下命令 前端项目搭建(默认开发环境:node20,Jdk17) 创建项目并下载依赖–执行以下命令 创建项目 y…

力扣--LCR 134.Pow(x,n)

题目 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000 示例 2: 输入:x 2.10000, n 3 输出:9.2610…

道可云人工智能元宇宙每日资讯|全国工商联人工智能委员会成立会议在南京举办

道可云元宇宙每日简报(2024年12月5日)讯,今日元宇宙新鲜事有: 全国工商联人工智能委员会成立会议在南京举办 全国工商联人工智能委员会成立会议日前在江苏省南京市举办。中央统战部副部长、全国工商联党组书记沈莹出席会议并讲话…

基于Qt的文字处理软件(二)

这期文章我们进行主窗口的一些函数的定义,同时导入一些文字处理软件的状态栏会用到的图标。下面图片是图标导入到项目后的一个示例,图标可以到阿里矢量图标库里面找到。 一、导入图标资源: 1.首先在项目目录的位置创建一个images的文件,然后将收集好的图…

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能,通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1.WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…

element plus table组件多选获取数据id

首先给table加上 selection-change"handleSelectionChange"事件 示例 <el-table selection-change"handleSelectionChange" stripe:data"data?.slice((currentPage3 - 1) * pageSize3, currentPage3 * pageSize3)" style"width: 100%…

信号的捕捉

目录 一、内核态与用户态的切换 二、 sigaction 参数介绍​编辑 三、 signal 四、某个信号在正在捕捉期间&#xff0c;该信号不允许再次被递达 五、可重入与不可重入函数&#xff08;描述函数的特性&#xff09; 六、volatile关键字 七、SIGCHLD信号 一、内核态与用户态的…

UTS 2022 致命问题修复:达梦数据库,记录数支持100万条

UTS 数据传输系统升级说明 升级内容&#xff1a; 致命问题修复 达梦数据库作为数据源&#xff1a; 当单个时间戳的记录数超过 10,000 条时&#xff0c;系统读取可能出现问题&#xff0c;已针对该场景优化数据处理逻辑&#xff0c;提升读取性能与稳定性。当单个时间戳值的重复…