当前位置: 首页 > news >正文

[C#数据加密]——MD5、SHA、AES、RSA

一、C#数据加密介绍


数据加密是信息安全领域的一个重要组成部分,它用于保护数据不被未授权访问。以下是一些常见的加密算法和方法:

1、MD5 (Message Digest Algorithm 5):

  • 一种广泛使用的哈希函数,可以产生128位的哈希值。
  • 通常用于验证文件完整性,但因为其易受到碰撞攻击,不推荐用于需要高安全性的场合。

 

2、SHA (Secure Hash Algorithm):

  • 一系列密码散列函数,包括SHA-1、SHA-2(如SHA-256、SHA-512)和SHA-3。
  • 比MD5更安全,能产生更长的哈希值,用于确保数据的完整性和验证。

3、AES (Advanced Encryption Standard):

  • 一种对称密钥加密标准,使用128位、192位或256位的密钥。
  • 非常安全,广泛用于保护数据传输和存储。

4、RSA:

  • 一种非对称加密算法,基于大整数分解的困难性。
  • 通常用于安全的数据传输,数字签名和密钥交换。
  • RSA算法使用两个密钥:一个公钥用于加密,一个私钥用于解密。

二、C#数据加密示例

1、可以使用System.Security.Cryptography命名空间中的MD5类来实现MD5哈希算法。以下是一个简单的C#代码示例,演示如何使用MD5对字符串进行哈希计算:

using System;
using System.Security.Cryptography;
using System.Text;public class MD5Example
{public static void Main(string[] args){// 待加密的原始字符串string originalString = "Hello, World!";// 将字符串转换为字节数组byte[] inputBytes = Encoding.UTF8.GetBytes(originalString);// 创建MD5哈希算法实例using (MD5 md5 = MD5.Create()){// 计算哈希值byte[] hashBytes = md5.ComputeHash(inputBytes);// 将哈希值转换为十六进制字符串StringBuilder hashStringBuilder = new StringBuilder();for (int i = 0; i < hashBytes.Length; i++){hashStringBuilder.Append(hashBytes[i].ToString("x2"));}// 输出MD5哈希值Console.WriteLine("MD5 Hash: " + hashStringBuilder.ToString());}}
}

2、可以使用System.Security.Cryptography命名空间中的SHA256类来实现SHA-256哈希算法。以下是一个C#代码示例,演示如何使用SHA-256对字符串进行哈希计算:

using System;
using System.Security.Cryptography;
using System.Text;public class SHA256Example
{public static void Main(string[] args){// 待加密的原始字符串string originalString = "Hello, World!";// 将字符串转换为字节数组byte[] inputBytes = Encoding.UTF8.GetBytes(originalString);// 创建SHA256哈希算法实例using (SHA256 sha256 = SHA256.Create()){// 计算哈希值byte[] hashBytes = sha256.ComputeHash(inputBytes);// 将哈希值转换为十六进制字符串StringBuilder hashStringBuilder = new StringBuilder();for (int i = 0; i < hashBytes.Length; i++){hashStringBuilder.Append(hashBytes[i].ToString("x2"));}// 输出SHA-256哈希值Console.WriteLine("SHA-256 Hash: " + hashStringBuilder.ToString());}}
}

3、使用AES加密数据可以通过System.Security.Cryptography命名空间中的Aes类来实现。以下是一个使用AES加密算法的示例代码,包括密钥生成、加密和解密过程:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;public class AESExample
{public static void Main(string[] args){// 待加密的数据string originalData = "Hello, World!";byte[] dataToEncrypt = Encoding.UTF8.GetBytes(originalData);// 使用256位密钥using (Aes aes = Aes.Create()){aes.Key = Encoding.UTF8.GetBytes("your-32-byte-long-key-here!"); // 密钥长度可以是16, 24, 32字节aes.IV = Encoding.UTF8.GetBytes("your-16-byte-long-iv-here!");   // IV长度必须和块大小相同,对于AES是16字节// 准备内存流以用于加密using (MemoryStream memoryStream = new MemoryStream()){// 将加密流包装在内存流中using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write)){// 写入数据并加密cryptoStream.Write(dataToEncrypt, 0, dataToEncrypt.Length);cryptoStream.FlushFinalBlock(); // 必须调用以完成加密过程}// 转换加密后的数据为16进制字符串string encryptedData = Convert.ToBase64String(memoryStream.ToArray());Console.WriteLine("Encrypted Data: " + encryptedData);// 为了演示解密,我们在这里也提供解密的代码// 准备内存流以用于解密using (MemoryStream decryptMemoryStream = new MemoryStream(Convert.FromBase64String(encryptedData))){// 将解密流包装在内存流中using (CryptoStream decryptCryptoStream = new CryptoStream(decryptMemoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read)){// 读取解密后的数据byte[] decryptedData = new byte[dataToEncrypt.Length];int decryptedCount = decryptCryptoStream.Read(decryptedData, 0, decryptedData.Length);// 转换解密后的数据为字符串string decryptedDataString = Encoding.UTF8.GetString(decryptedData, 0, decryptedCount);Console.WriteLine("Decrypted Data: " + decryptedDataString);}}}}}
}

4、使用RSA加密和解密可以通过System.Security.Cryptography命名空间中的RSA类来实现。以下是一个C#代码示例,演示了如何生成RSA密钥对、使用公钥加密数据以及使用私钥解密数据:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;public class RSAExample
{public static void Main(string[] args){// 生成RSA密钥对using (var rsa = new RSACryptoServiceProvider(2048)){// 获取公钥和私钥byte[] publicKey = rsa.ToXmlString(false).DecodeFromXmlString().GetRSAPublicKey();byte[] privateKey = rsa.ToXmlString(true).DecodeFromXmlString().GetRSAPrivateKey();// 待加密的原始数据string originalData = "Hello, World!";byte[] dataToEncrypt = Encoding.UTF8.GetBytes(originalData);// 使用公钥加密数据byte[] encryptedData = rsa.Encrypt(dataToEncrypt, true);// 显示加密后的数据Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));// 使用私钥解密数据byte[] decryptedData = rsa.Decrypt(encryptedData, true);// 显示解密后的数据string decryptedDataString = Encoding.UTF8.GetString(decryptedData);Console.WriteLine("Decrypted Data: " + decryptedDataString);// 保存和加载密钥对SaveRSAKey(rsa, "rsaKeys.xml");using (var rsaFromStorage = LoadRSAKey("rsaKeys.xml")){// 可以继续使用加载的密钥进行加密或解密操作}}}private static void SaveRSAKey(RSACryptoServiceProvider rsa, string filename){// 将私钥保存到文件File.WriteAllText(filename, rsa.ToXmlString(true));}private static RSACryptoServiceProvider LoadRSAKey(string filename){// 从文件加载私钥string xml = File.ReadAllText(filename);return new RSACryptoServiceProvider().FromXmlString(xml);}
}public static class RSAExtensions
{public static byte[] GetRSAPublicKey(this RSAParameters rsaParams){byte[] publicKey = new byte[rsaParams.Modulus.Length + rsaParams.Exponent.Length];Array.Copy(rsaParams.Modulus, 0, publicKey, 0, rsaParams.Modulus.Length);Array.Copy(rsaParams.Exponent, 0, publicKey, rsaParams.Modulus.Length, rsaParams.Exponent.Length);return publicKey;}public static byte[] GetRSAPrivateKey(this RSAParameters rsaParams){byte[] privateKey = new byte[rsaParams.Modulus.Length + rsaParams.Exponent.Length + rsaParams.D.Length + rsaParams.P.Length + rsaParams.Q.Length];Array.Copy(rsaParams.Modulus, 0, privateKey, 0, rsaParams.Modulus.Length);Array.Copy(rsaParams.Exponent, 0, privateKey, rsaParams.Modulus.Length, rsaParams.Exponent.Length);Array.Copy(rsaParams.D, 0, privateKey, rsaParams.Modulus.Length + rsaParams.Exponent.Length, rsaParams.D.Length);Array.Copy(rsaParams.P, 0, privateKey, rsaParams.Modulus.Length + rsaParams.Exponent.Length + rsaParams.D.Length, rsaParams.P.Length);Array.Copy(rsaParams.Q, 0, privateKey, rsaParams.Modulus.Length + rsaParams.Exponent.Length + rsaParams.D.Length + rsaParams.P.Length, rsaParams.Q.Length);return privateKey;}public static string DecodeFromXmlString(this byte[] xmlBytes){return Encoding.UTF8.GetString(xmlBytes);}
}

三、数据加密完结

        每种加密方法都有其特定的用途和安全级别。选择哪种加密方法取决于你的具体需求,比如需要保护的数据类型、安全要求、性能考虑等。在实际应用中,通常需要结合使用多种加密技术来达到最佳的安全效果。

相关文章:

[C#数据加密]——MD5、SHA、AES、RSA

一、C#数据加密介绍 数据加密是信息安全领域的一个重要组成部分&#xff0c;它用于保护数据不被未授权访问。以下是一些常见的加密算法和方法&#xff1a; 1、MD5 (Message Digest Algorithm 5): 一种广泛使用的哈希函数&#xff0c;可以产生128位的哈希值。通常用于验证文件完…...

QT不阻塞UI的方式

方法1&#xff1a;QtConcurrent #include <QtConcurrent> #include <QFuture> #include <QFutureWatcher> #include <QDebug>void longRunningTask() {// 模拟耗时操作QThread::sleep(5); }void startTask() {QFuture<void> future QtConcurre…...

鸿蒙HarmonyOS开发:常用布局及实用技巧

文章目录 一、概述二、盒子模型三、线性布局&#xff08;Column/Row&#xff09;1、space属性2、justifyContent属性3、alignItems属性 四、实用技巧1、Blank组件的使用2、layoutWeight属性的使用 一、概述 布局是指对页面组件进行排列和定位的过程&#xff0c;其目的是有效地…...

【解答】洛必达法则的使用条件及常见错误,洛必达法则的适用条件,常见的易错点,2022数一第一题例题

目录 洛必达法则的使用条件及常见错误 洛必达法则的适用条件 常见的易错点 举例说明&#xff08;见D选项&#xff09; 总结 &#x1f308; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30c; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你&…...

使用Python下载飞书共享表格数据教程

写在前面 随着企业协作办公软件的流行&#xff0c;飞书以其高效的协作能力和便捷的共享功能&#xff0c;成为了许多公司必备的工具之一。在日常工作中&#xff0c;我们经常需要从飞书中下载共享的表格数据进行分析。本文将详细介绍如何使用Python下载飞书共享表格数据。 前置…...

【C++】protobuf的简单使用(通讯录例子)

protobuf的简单使用&#xff08;通讯录例子&#xff09; .proto文件的编写保留字段字段唯一编号protobuf的类型enum类型Any类型oneof类型map类型完整通讯录代码.proto文件write文件read文件运行结果 .proto文件的编写 syntax用于指定protobuf的语法&#xff1b;package当.prot…...

Apple 智能基础语言模型

Introducing Apple’s On-Device and Server Foundation Models technical details June 10, 2024 在2024年的全球开发者大会上&#xff0c;苹果推出了Apple Intelligence&#xff0c;这是一个深度集成到iOS 18、iPadOS 18和macOS Sequoia中的个人智能系统。Apple Intelligen…...

GreptimeDB融资数百万美元; Oracle提供免费长期MySQL; 谷歌大模型支持云数据库问题洞察

重要更新 1. 开源时序数据库 GreptimeDB宣布完成数百万美元的新一轮融资。GreptimeDB是一款Rust 语言编写的时序数据库&#xff0c;具有分布式&#xff0c;开源&#xff0c;云原生&#xff0c;兼容性强等特点&#xff0c;帮助企业实时读写、处理和分析时序数据的同时&#xff0…...

Java中的抽象类与接口

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c; 如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 比如&…...

云计算概念以及与云服务的区别

目录 1.云的概念 1.1 什么是云&#xff1f; 1.2 云计算的类型 1.3 云计算的服务模式 1.4 云计算的优势 2.云计算和云服务的区别 2.1 定义 2.2 范围 2.3 角色 2.5 举例 2.6使用者 3.总结 1.云的概念 1.1 什么是云&#xff1f; “云”在计算机科学和信息技术领域通常…...

Netty技术全解析:LengthFieldBaseFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…...

深入InnoDB核心:揭秘B+树在数据库索引中的高效应用

目录 一、索引页与数据行的紧密关联 &#xff08;一&#xff09;数据页的双向链表结构 &#xff08;二&#xff09;记录行的单向链表结构 二、未创建索引情况 &#xff08;一&#xff09;无索引下的单页查找过程 以主键为搜索条件 以非主键列为搜索条件 &#xff08;二…...

c++(面向对象的性质:抽象,封装,继承,多态)

ctrla全选&#xff0c;ctrli对齐 ctrl/ 一起注释 ctrlz 退回上一步 一些基础的内容&#xff1a; cout&#xff1a;输出流对象 cin&#xff1a;输入流对象 输入一个i和一个j&#xff0c;然后输出ij的和&#xff1a; 值不变的原因&#xff1a; 值传递&#xff0c;a和i是…...

java基础学习笔记1

Java编程规范 命名风格 1. 【强制】代码中的命名均不能以下划线或美元符号开始&#xff0c;也不能以下划线或美元符号结束。 反例&#xff1a;_name / __name / $name / name_ / name$ / name__ 2. 【强制】代码中的命名严禁使用拼音与英文混合的方式&#xff0c;更不允许直…...

[VBA]使用VBA在Excel中 操作 形状shape 对象

excel已关闭地图插件,对于想做 地图可视化 的,用形状来操作是一种办法,就是要自行找到合适的 地图形状,修改形状颜色等就可以用于 可视化展示不同省市销量、人口等数据。 引言 在Excel中,通过VBA(Visual Basic for Applications)可以极大地增强数据可视化和报告自动化…...

Apache POI 实现 Excel 表格下载

这里以苍穹外卖中数据导出功能为例&#xff0c;记录下 Apache POI 导出 Excel 表格的过程。 首先在 pom.xml 中导入相关依赖 <!-- poi 用于操作 excel 表格--> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId&…...

大华嵌入式面试题大全及参考答案(2万字长文)

目录 在C语言中,static 关键字有哪些主要用途? static 修饰的全局变量与普通全局变量有什么区别? 为什么要在嵌入式系统中使用 static 修饰函数? 虚函数与纯虚函数了解么? strcpy 给你加结束符吗,还是要自己加? select 的作用是什么,它和 epoll 的区别? map 与…...

C语言——查漏补缺

前言 本篇博客主要记录一些C语言的遗漏点&#xff0c;完成查漏补缺的工作&#xff0c;如果读者感兴趣&#xff0c;可以看看下面的内容。都是一些小点&#xff0c;下面进入正文部分。 1. 字符汇聚 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 #inclu…...

Python | Leetcode Python题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; class Solution:def oddEvenList(self, head: ListNode) -> ListNode:if not head:return headevenHead head.nextodd, even head, evenHeadwhile even and even.next:odd.next even.nextodd odd.nexteven.next odd.nexteven even…...

吉瑞外卖笔记

1.项目整体搭建 这里用到的是springboot3mybatisplus 1.1数据库搭建 整体表搭建&#xff0c;这里我是直接用的老师给的数据库 1.2maven项目搭建 依赖 这两个jar包第一次用&#xff0c;记录一下 fastjson json处理&#xff0c;可将对象转化为json形式 可将对象中的属性…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...