C#实现各种Hash计算

C#实现各种Hash计算

文章目录

  • C#实现各种Hash计算
    • 涉及框架及库
    • 目前支持可计算的类型
      • 核心代码
      • 完整可运行代码
    • BCrypt
    • 总结

涉及框架及库

自己在NuGet管理器里面安装即可

  • BouncyCastle.Cryptography:是加密算法和协议的.NET实现。

目前支持可计算的类型

  • BLAKE2B_160
  • BLAKE2B_256
  • BLAKE2B_384
  • BLAKE2B_512
  • BLAKE2S_128
  • BLAKE2S_160
  • BLAKE2S_224
  • BLAKE2S_256
  • BLAKE3_256
  • DSTU7564_256
  • DSTU7564_384
  • DSTU7564_512
  • GOST3411
  • GOST3411_2012_256
  • GOST3411_2012_512
  • KECCAK_224
  • KECCAK_256
  • KECCAK_288
  • KECCAK_384
  • KECCAK_512
  • MD2
  • MD4
  • MD5
  • RIPEMD128
  • RIPEMD160
  • RIPEMD256
  • RIPEMD320
  • SHA_1
  • SHA_224
  • SHA_256
  • SHA_384
  • SHA_512
  • SHA_512_224
  • SHA_512_256
  • SHA3_224
  • SHA3_256
  • SHA3_384
  • SHA3_512
  • SHAKE128_256
  • SHAKE256_512
  • SM3
  • TIGER
  • WHIRLPOOL

核心代码

  1. 根据对应的算法名称获取用以计算哈希的对象
var digest = DigestUtilities.GetDigest("md5");
  1. 将需要计算的字符串转换为字节数组
var pla = "1234";
var inBytes = Encoding.UTF8.GetBytes(pla);

其它数据源

  • 文件
File.ReadAllBytes(filepath);
  • Hex字符串
Hex.Decode(pla);
  • Base64
Convert.FromBase64String(pla);
  • Stream流
using (Stream stream = new MemoryStream())
{stream.Read(inBytes, 0, (int)stream.Length);
}
  1. 计算Hash
// 获取输出字节数组大小
var outlen = digest.GetDigestSize();// 实例化一个接受输出结果的字节数组
var outBytes = new byte[outlen];// 数据搞里头
digest.BlockUpdate(inBytes, 0, inBytes.Length);// 结果搞出来
digest.DoFinal(outBytes, 0);// 打印Hash值
Console.WriteLine($"{Hex.ToHexString(outBytes)}"); 

完整可运行代码

private static string[] testDigests => new string []
{"BLAKE2B_160","BLAKE2B_256","BLAKE2B_384","BLAKE2B_512","BLAKE2S_128","BLAKE2S_160","BLAKE2S_224","BLAKE2S_256","BLAKE3_256","DSTU7564_256","DSTU7564_384","DSTU7564_512","GOST3411","GOST3411_2012_256","GOST3411_2012_512","KECCAK_224","KECCAK_256","KECCAK_288","KECCAK_384","KECCAK_512","MD2","MD4","MD5","RIPEMD128","RIPEMD160","RIPEMD256","RIPEMD320","SHA_1","SHA_224","SHA_256","SHA_384","SHA_512","SHA_512_224","SHA_512_256","SHA3_224","SHA3_256","SHA3_384","SHA3_512","SHAKE128_256","SHAKE256_512","SM3","TIGER","WHIRLPOOL",
}; static void Main(string[] args)
{IDigest digest = DigestUtilities.GetDigest("md5");var pla = "1234";var inBytes = Encoding.UTF8.GetBytes(pla);Console.ForegroundColor = ConsoleColor.Green;Console.Write($"明文消息");Console.ForegroundColor = ConsoleColor.White;Console.WriteLine($":{pla}{Environment.NewLine}");for (int i = 0; i < testDigests.Length; i++){digest = DigestUtilities.GetDigest(testDigests[i]);var outlen = digest.GetDigestSize();var outBytes = new byte[outlen];digest.BlockUpdate(inBytes, 0, inBytes.Length);digest.DoFinal(outBytes, 0);Console.ForegroundColor = ConsoleColor.Green;Console.Write($"{digest.AlgorithmName}");Console.ForegroundColor = ConsoleColor.White;Console.WriteLine($":{Hex.ToHexString(outBytes)}");}Console.ReadKey();
}

运行结果:
在这里插入图片描述

BCrypt

直接上代码片段,应该不难理解

char[] pw = "123".ToCharArray();
byte[] salt = new byte[16];
var rng = new SecureRandom();
rng.NextBytes(salt);
var cost = 10;
var hash = OpenBsdBCrypt.Generate(pw, salt, cost);
var hash2 = OpenBsdBCrypt.Generate("2a", pw, salt, cost);
Console.WriteLine($"{hash}");
Console.WriteLine($"{hash2}");

目前支持的的版本有:2a、2b、2y(默认)
运行结果:
在这里插入图片描述

在线校验一遍
在这里插入图片描述

总结

  1. 注意Base64的转换,C#对Base64的格式检验的较为严格,可能会因为字符数不够或有非法字符,从而导致Base64在转换为字节数组时报错,需要修正一下格式。(方法自行百度)

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

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

相关文章

如何在Idea离线情况下安装vue.js插件

亲践有效&#xff0c;步骤如下: 1. 互联网环境登陆vue.js官网(Vue.js - IntelliJ IDEs Plugin | Marketplace)。 2. 然后先确定你的IDEA的版本&#xff1a;在你IDEA的安装文件中找到product-info.json&#xff0c;里面的buildNumber记录着你IDEA的精确版本号&#xff0c;根据…

roscore启动报错的解决方法【将环境变量配置于最后】

今天在启动rviz时发生一个很奇怪的报错&#xff1a; rviz: error while loading shared libraries: librviz.so: cannot open shared object file: No such file or directory 我感觉很纳闷&#xff01;再试着启动一下roscore&#xff0c;发现如下报错&#xff1a; [rosout-1…

Python爬虫从入门到精通:一篇涵盖所有细节的高质量教程

目录 第一部分&#xff1a;Python爬虫基础 1.1 爬虫原理 1.2 Python爬虫常用库 1.3 爬虫实战案例 1.4 注意事项 第二部分&#xff1a;爬虫进阶技巧 2.1 处理动态加载的内容 2.2 登录认证 2.3 分布式爬取 2.4 反爬虫策略 第三部分&#xff1a;爬虫实战项目 3.1 豆瓣…

【C语言】指针(二)

目录 一、传值调用和传址调用 二、数组名的理解 三、通过指针访问数组 四、一维数组传参的本质 五、指针数组 六、指针数组模拟实现二维数组 一、传值调用和传址调用 指针可以用在哪里呢&#xff1f;我们看下面一段代码&#xff1a; #include <stdio.h>void Swap(i…

基于Spring封装一个websocket工具类使用事件发布进行解耦和管理

最近工作中&#xff0c;需要将原先的Http请求换成WebSocket&#xff0c;故此需要使用到WebSocket与前端交互。故此这边需要研究一下WebSocket到底有何优点和不可替代性&#xff1a; WebSocket优点&#xff1a; WebSocket 协议提供了一种在客户端和服务器之间进行全双工通信的…

异地组网群晖不能访问怎么办?

在日常使用群晖网络储存设备时&#xff0c;我们常常会遇到无法访问的情况&#xff0c;特别是在异地组网时。这个问题很常见&#xff0c;但也很让人困扰。本文将针对异地组网群晖无法访问的问题进行详细解答和分析。 异地组网的问题 在异地组网中&#xff0c;群晖设备无法访问的…

Unity | Spine动画动态加载

一、准备工作 Spine插件及基本知识可查看这篇文章&#xff1a;Unity | Spine动画记录-CSDN博客 二、Spine资源动态加载 1.官方说明 官方文档指出不建议这种操作。但spine-unity API允许在运行时从SkeletonDataAsset或甚至直接从三个导出的资产实例化SkeletonAnimation和Skel…

HNU-算法设计与分析-作业3

第三次作业【动态规划】 文章目录 第三次作业【动态规划】<1>算法实现题 3-1 独立任务最优解问题<2>算法实现题 3-4 数字三角形问题<3>算法实现题 3-8 最小m段和问题<4>算法实现题 3-25 m处理器问题 <1>算法实现题 3-1 独立任务最优解问题 ▲问…

Linux(七) 动静态库

目录 一、动静态库的概念 二、静态库的打包与使用 2.1 静态库的打包 2.2 静态库的使用 三、动态库的打包与使用 3.1 动态库的打包 3.2 动态库的使用 3.3 运行动态库的四种方法 四、总makefile 一、动静态库的概念 静态库&#xff1a; Linux下&#xff0c;以.a为后缀的…

Python专题:十五、JSON数据格式

Python的数据处理&#xff1a;JOSN 计算机的主要工作&#xff1a;处理数据 最容易处理的数据就是结构化数据 非结构化数据&#xff1a;视频&#xff0c;文件等 近些年的大数据、数据挖掘就是对互联网中的各种非结构化的数据的分析和处理 半结构化数据 明确的结构属性&…

陪诊服务运用预约小程序的效果是什么

在中高型城市里&#xff0c;陪诊师近些年也很有热度&#xff0c;已经衍生成为一个新的小众行业&#xff0c;不同医院/不同科目等其它情况针对不同群体往往很难完善&#xff0c;比如部分老年人腿脚不便、不认识字、外地语言难以沟通等&#xff0c;陪诊师的作用就尤为凸显. 对相…

[Bootloader][uboot]code总结

文章目录 1、U_BOOT_DRIVER2、DM框架dm_scan_platdatadm_extended_scan_fdt 1、U_BOOT_DRIVER 使用这个宏可以定义一个驱动实例&#xff0c;宏定义是 其中使用的struct driver结构体 使用的ll_entry_declare宏定义是 归结为 2、DM框架 1、 DM框架 DM模型抽象出了以下四个…

16.投影矩阵,最小二乘

文章目录 1. 投影矩阵1.1 投影矩阵P1.2 投影向量 1. 投影矩阵 1.1 投影矩阵P 根据上节知识&#xff0c;我们知道当我们在解 A X b AXb AXb的时候&#xff0c;发现当向量b不在矩阵A的列空间的时候&#xff0c;我们希望的是通过投影&#xff0c;将向量b投影到矩阵A的列空间中&…

ModuleNotFoundError: No module named ‘sklearn‘

ModuleNotFoundError: No module named sklearn 解决办法&#xff1a; pip install scikit-learn

7B2 PRO主题5.4.2免授权直接安装

B2 PRO 5.4.2 最新免授权版不再需要改hosts&#xff0c;直接在wordpress上传安装即可

Vue的学习 —— <网络请求库Axios>

目录 前言 正文 一、Axios基本概念 二、安装Axios 三、Axios使用方法 四、向服务器发送请求 前言 在之前的开发案例中&#xff0c;我们通常直接在组件中定义数据。但在实际的项目开发中&#xff0c;我们需要从服务器获取数据。当其他用户希望访问我们自己编写的网页时&a…

定档 11.2-3,COSCon'24 第九届中国开源年会暨开源社十周年嘉年华正式启动!

中国开源年会 COSCon 是业界最具影响力的开源盛会之一&#xff0c;由开源社在2015年首次发起&#xff0c;今年将举办第九届。 以其独特定位及日益增加的影响力&#xff0c;COSCon 吸引了越来越多的国内外企业、高校、开源组织/社区的大力支持。与一般企业、IT 媒体、行业协会举…

网络安全快速入门(十三)linux及vmware软件的网络配置

13.1 前言 在通过我们前面的了解&#xff0c;我们现在已经对Linux的基础知识有了大致的了解&#xff0c;今天我们来大概讲一下关于linux系统及vmware的网络配置问题&#xff0c;在这之前&#xff0c;我们需要对网络有一个大概的认识和了解&#xff0c;话不多说&#xff0c;我们…

HNU-算法设计与分析-作业5

第五次作业【回溯算法】 文章目录 第五次作业【回溯算法】<1> 算法分析题5-3 回溯法重写0-1背包<2> 算法分析题5-5 旅行商问题&#xff08;剪枝&#xff09;<3> 算法实现题5-2 最小长度电路板排列问题<4> 算法实现题5-7 n色方柱问题<5> 算法实现…

公共字段填充(AOP的使用)

Thread是线程池,ThreadLocal是线程变量,每个线程变量是封闭的,与其它线程变量分隔开来,在sky-common下的com.sky.context包下有一个Basecontext类 public class BaseContext {//每一个上下文创建了一个线程变量,用来存储long类型的id//创建三个方法,用来设置,取用,删除idpubli…