C# .Net学习笔记—— 加密和解密算法

一、四种加密方式

1、MD5不可逆加密

2、Des对称可逆加密

3、RSA非对称可逆加密

4、数字证书SSL

二、详解

1、MD5加密

 public class MD5Encrypt{public static string Encrypt(string source, int length = 32){if (string.IsNullOrEmpty(source)) return string.Empty;HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;byte[] bytes = Encoding.UTF8.GetBytes(source);byte[] hashValue = provider.ComputeHash(bytes);StringBuilder sb = new StringBuilder();switch (length){case 16:for (int i = 4; i < 12; i++){sb.Append(hashValue[i].ToString("x2"));}break;case 32:for (int i = 0; i < 16; i++){sb.Append(hashValue[i].ToString("x2"));}break;default:for (int i = 0; i < hashValue.Length; i++){sb.Append(hashValue[i].ToString("x2"));}break;}return sb.ToString();}public static string AbstractFile(string filePath){using (FileStream file = new FileStream(filePath, FileMode.Open)) {return AbstractFile(file);}}public static string AbstractFile(Stream stream) {MD5 md5 = new MD5CryptoServiceProvider();byte[] retVal = md5.ComputeHash(stream);StringBuilder sb = new StringBuilder();for (int i = 0; i < retVal.Length; i++){sb.Append(retVal[i].ToString("x2"));}return sb.ToString();}}

调用

//字符串MD5
Console.WriteLine(MD5Encrypt.Encrypt("1"));
Console.WriteLine(MD5Encrypt.Encrypt("1"));
Console.WriteLine(MD5Encrypt.Encrypt("12"));
Console.WriteLine(MD5Encrypt.Encrypt("1fsdfasd"));
Console.WriteLine(MD5Encrypt.Encrypt("晚上发范德萨飞洒登封市大锅饭大锅饭电话"));//文件MD5
Console.WriteLine(MD5Encrypt.AbstractFile("C:\\Users\\Daschow\\Desktop\\01.txt"));
Console.WriteLine(MD5Encrypt.AbstractFile("C:\\Users\\Daschow\\Desktop\\01 - 副本.txt"));

得出结果

* 通过上面结果可以得出规律

MD5可以得到一串定长的随机编码

传入的字符串或者文件相同,得到的编码是相同的

只要稍微有一点不同得到的MD5都是不同的

用处:

1、账号登陆,数据库内防止看到密码明文
(1)注册密码
(2)MD5一下,保存
(3)登陆的时候,输入的密码也md5一下,比对

2、疑问:

md5不能解密?

不能解密 网上的解密都是基于样本比对,只能解密简单的密码
密码最好设置复杂点,也加盐(密码+后缀 再MD5)(双MD5)

2、Des加密(可逆对称加密)

1、可逆对称加密

2、数据传输 加密速度快。

3、因为要把密钥发给别人,密钥的安全是问题

4、公开算法,即使拿到密文,也推算不了密钥,也推算不了原文

public class DesEncrypt{private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Substring(0, 8));private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Insert(0, "w").Substring(0, 8));/// <summary>/// DES 加密/// </summary>/// <param name="text">需要加密的值</param>/// <returns>加密后的结果</returns>public static string Encrypt(string text){DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();using (MemoryStream memStream = new MemoryStream()){CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);StreamWriter sWriter = new StreamWriter(crypStream);sWriter.Write(text);sWriter.Flush();crypStream.FlushFinalBlock();memStream.Flush();return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);}}/// <summary>/// DES解密/// </summary>/// <param name="encryptText"></param>/// <returns>解密后的结果</returns>public static string Decrypt(string encryptText){DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();byte[] buffer = Convert.FromBase64String(encryptText);using (MemoryStream memStream = new MemoryStream()){CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);crypStream.Write(buffer, 0, buffer.Length);crypStream.FlushFinalBlock();return ASCIIEncoding.UTF8.GetString(memStream.ToArray());}}}

 3、Rsa加密(可逆非对称加密)

1、如图,任何人都可以随意获取公钥,并且可以在拿到私钥后解析Eleven说的话。

但是这种方式保证了消息一定是来自于Eleven。

2、加密钥作为私钥,解密钥作为公钥。别人只能解密由Eleven加密的东西

3、如果反过来,加密钥作为公钥,解密钥作为私钥。那东西只有Eleven能看

4、如果合起来准备两套,一套保证签名安全,一套保证信息安全(即只有Elevent能加密并且只有Elevent能看)

public class RsaEncrypt{/// <summary>/// 获取加密/解密对/// 给你一个,是无法推算出另外一个的/// /// Encrypt   Decrypt/// </summary>/// <returns>Encrypt   Decrypt</returns>public static KeyValuePair<string, string> GetKeyPair(){RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();string publicKey = RSA.ToXmlString(false);string privateKey = RSA.ToXmlString(true);return new KeyValuePair<string, string>(publicKey, privateKey);}/// <summary>/// 加密:内容+加密key/// </summary>/// <param name="content"></param>/// <param name="encryptKey">加密key</param>/// <returns></returns>public static string Encrypt(string content, string encryptKey){RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();rsa.FromXmlString(encryptKey);UnicodeEncoding ByteConverter = new UnicodeEncoding();byte[] DataToEncrypt = ByteConverter.GetBytes(content);byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);return Convert.ToBase64String(resultBytes);}/// <summary>/// 解密  内容+解密key/// </summary>/// <param name="content"></param>/// <param name="decryptKey">解密key</param>/// <returns></returns>public static string Decrypt(string content, string decryptKey){byte[] dataToDecrypt = Convert.FromBase64String(content);RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();RSA.FromXmlString(decryptKey);byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);UnicodeEncoding ByteConverter = new UnicodeEncoding();return ByteConverter.GetString(resultBytes);}/// <summary>/// 可以合并在一起的,,每次产生一组新的密钥/// </summary>/// <param name="content"></param>/// <param name="encryptKey">加密key</param>/// <param name="decryptKey">解密key</param>/// <returns>加密后结果</returns>private static string Encrypt(string content, out string publicKey, out string privateKey){RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();publicKey = rsaProvider.ToXmlString(false);privateKey = rsaProvider.ToXmlString(true);UnicodeEncoding ByteConverter = new UnicodeEncoding();byte[] DataToEncrypt = ByteConverter.GetBytes(content);byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt, false);return Convert.ToBase64String(resultBytes);}}
	KeyValuePair<string, string> encryptDecrypt = RsaEncrypt.GetKeyPair();string rsaEn1 = RsaEncrypt.Encrypt("net", encryptDecrypt.Key); //key加密string rsaDel = RsaEncrypt.Decrypt(rsaEn1, encryptDecrypt.Value);  //value解密

 

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

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

相关文章

002、使用 Cargo 创建新项目,打印 Hello World

1. Cargo 简介 Cargo 是 Rust 的构建系统和包管理工具&#xff0c;比如构建代码、下载依赖的库、构建这些库等等。在安装 Rust 时&#xff0c;Cargo也会一起安装。 2. 创建新项目的具体步骤 步骤1&#xff1a; 我们在桌面新建一个文件夹&#xff0c;用于存放后面练习用的代码文…

免费好用的10款AI配音软件,总有一款适合你

随着人工智能技术的快速进步&#xff0c;越来越多的语音合成软件开始在我们的日常生活中应用。这些软件能够将文字转化为自然流畅的语音&#xff0c;并且能够模拟各种声音和语调&#xff0c;给人们带来了巨大的便利和创造性。在这其中&#xff0c;配音软件尤其受到广泛欢迎&…

微信小程序备案流程整理

一、备案流程 [找备案入口]–[填主体信息]–[填小程序信息]–[初审]–[短信核验]–[通管局审核] 1&#xff0c;在小程序后台找到备案入口 &#xff08;1&#xff09;新的未上架小程序&#xff0c;可以在小程序首页点击【去备案】进入。 &#xff08;2&#xff09;已上架小程…

工具系列:TimeGPT_(3)处理假期和特殊日期

日历变量和特殊日期是预测应用中最常见的外生变量类型之一。它们为时间序列的当前状态提供了额外的上下文信息&#xff0c;特别是对于基于窗口的模型&#xff08;如TimeGPT-1&#xff09;而言。这些变量通常包括添加每个观测的月份、周数、日期或小时数的信息。例如&#xff0c…

SpringBoot 3.2.0 基于SpringDoc接入OpenAPI实现接口文档

依赖版本 JDK 17 Spring Boot 3.2.0 SpringDoc 2.3.0 工程源码&#xff1a;Gitee 导入依赖 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEnco…

EasyCVR无人机推流+人数统计AI算法,助力公共场所人群密度管控

一、背景与需求 在公共场所和大型活动的管理中&#xff0c;人数统计和人群密度控制是非常重要的安全问题。传统的方法可能存在效率低下或准确度不足的情况&#xff0c;无法满足现代社会的需求。TSINGSEE青犀可以利用无人机推流AI人流量统计算法&#xff0c;基于计算机视觉技术…

渗透测试(Lab4.0)

配置WebDeveloper的时候遇到一个错误 导入失败&#xff0c;因为 E:…ovf 未通过 OVF 规范一致性或虚拟硬件合规性检查。 请单击“重试”放松 OVF 规范与虚拟硬件合规性检查&#xff0c;并重新尝试导入&#xff1b; 或单击“取消”以取消导入。如果重新尝试导入&#xff0c;可能…

javaweb--实验十 --期末复盘

实验十 JDBC连接MySQL 本次实验没有代码补全&#xff0c;以下都是完整过程&#xff0c;详细关注连接过程的问题 一、实验目的&#xff1a; 1、掌握JDBC连接数据库的一般操作。 2、理解JavaBean的基本作用。 3、理解分层设计的思想。 二、 实验内容&#xff1a; 实现学生信…

PostgreSQL | FunctionProcedure | 函数与存储过程的区别

文章目录 PostgreSQL | Function&Procedure | 函数与存储过程的区别1. 简述书面说法大白话讲 2. 函数&#xff08;Function&#xff09;2.1 定义2.2 用途2.3 执行2.4 事务处理2.5 说点例子1. 当参数都是IN类时2. 参数中出现OUT、INOUT参数时 3. 存储过程&#xff08;Proced…

一图梳理多模态领域发展简史

本文采用关系图的方式整理了&#xff1a;CLiP、ViLT、FLiP、ALBEF、CoCa、BLiP、VLMo、BEiT 和BEiT v3等近几年来经典的多模态大模型&#xff0c;以及这些工作的相互依托关系。灵感来自&#xff1a;跟李沐读论文系列——多模态串讲 1 模型关系图&#xff1a; ’ 2 各模型的架…

OpenAPI,已支持表单数据格式校验

OpenAPI 路径 开放平台 功能简介 「OpenAPI」- 支持表单数据格式校验。 通过「OpenAPI-新增表单数据」接口&#xff0c;新增数据时&#xff0c;若数据格式不匹配&#xff0c;会导致无法新增。 例如&#xff0c;数字不能新增到日期格式的表单字段。 请参考数据格式传参&a…

跨境电商测评攻略及其工具海外云手机的介绍

近些年随着跨境电商的火热&#xff0c;各商家纷纷想尽办法在激烈的竞争中取得一席之地&#xff0c;产品测评就是其中一个重要手段。本文将详细阐述跨境电商的测评攻略以及介绍一个测评的好工具海外云手机。 不管是速卖通&#xff0c;还是亚马逊、ebay&#xff0c;做测评都是非常…

软件测试的人是专门为难开发人员的吗?不不不我是来和开发抬杠的

我觉得就对对对&#xff0c;就不应该有测试这个岗位。 开发完&#xff0c;直接上线。 你看&#xff1a; 1.省了测试人员的薪酬&#xff0c;岗位。 2.省了测试时间&#xff0c;快速交付。快速上线&#xff0c;抢占市场。 3.让用户当免费的测试劳动力。有问题让客户提BUG就好…

Python (十六) pandas(四)

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

<script setup> 的作用

一、使用<script setup> 之后&#xff0c;就不需要手动写以下代码&#xff0c;只要写逻辑代码 未加setup&#xff0c;vite 工程要加上下面代码 *export default{ * setup(){ * //只要写逻辑代码 * return{***} * } * } 加了setup &#xff0c;export default 、…

Java小案例-Feign的超时时间如何设置

前言 Feign的超时时间如何设置&#xff1f; Feign的超时时间设置方式并不固定&#xff0c;它取决于Feign在项目中是如何使用的&#xff0c;不同的使用方式&#xff0c;超时时间设置方式也不大相同&#xff0c;甚至还可能有坑。 由于文章会涉及到Feign的底层知识&#xff0c;…

【easy-ES使用】1.基础操作:增删改查、批量操作、分词查询、聚合处理。

easy-es、elasticsearch、分词器 与springboot 结合的代码我这里就不放了&#xff0c;我这里直接是使用代码。 基础准备&#xff1a; 创建实体类&#xff1a; Data // 索引名 IndexName("test_jc") public class TestJcES {// id注解IndexId(type IdType.CUSTOMI…

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(一)登录认证

一、JWT简介 JWT 全称 JSON Web Token&#xff0c;JWT 主要用于用户登录鉴权&#xff0c;当用户登录之后&#xff0c;返回给前端一个Token&#xff0c;之后用户利用Token进行信息交互。 除了JWT认证之外&#xff0c;比较传统的还有Session认证&#xff0c;如何选择可以查看之前…

Spring中常见的BeanFactory后处理器

常见的BeanFacatory后处理器 先给出没有添加任何BeanFactory后处理器的测试代码 public class TestBeanFactoryPostProcessor {public static void main(String[] args) {GenericApplicationContext context new GenericApplicationContext();context.registerBean("co…

JAVA复习三——CH5 Java Collection 、CH6 MultiThread

CH5 Java Collection(集合) 5.1 Java集合框架&#xff08;位于java.util包中&#xff09; 图一 集合框架图 从上面的集合框架图可以看到&#xff0c;Java 集合框架主要包括两种类型的容器&#xff0c;一种是集合&#xff08;Collection&#xff09;&#xff0c;存储一个元素集…