C#实现各种Hash计算

news2024/11/15 18:58:37

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.coloradmin.cn/o/1678430.html

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

相关文章

Laravel中使用MinIO进行文件操作及ZIP解压

Laravel中使用MinIO进行文件操作及ZIP解压指南 介绍 在本指南中&#xff0c;我们将详细介绍如何在laravel框架中操作minio&#xff0c;包含方法有&#xff1a;桶列表&#xff0c;创建桶&#xff0c;修改桶&#xff0c;上传文件&#xff0c;删除文件&#xff0c;生成直传链接&…

【全开源】JAVA语聊大厅语音聊天APP系统源码

语聊大厅语音聊天源码&#xff1a;打造专属的语音社交平台 核心功能 多人语音聊天&#xff1a;支持多人同时在线语音聊天&#xff0c;用户可以创建或加入不同的聊天室&#xff0c;与好友或陌生人进行实时互动。语音转文字&#xff1a;提供语音转文字功能&#xff0c;方便用户…

Folder Icons for Mac v1.9激活版:自定义文件夹图标

在追求个性和品味的今天&#xff0c;Folder Icons for Mac 让您的Mac桌面焕然一新。支持多种格式的图片和图标文件&#xff0c;满足您不同的审美需求。同时&#xff0c;软件提供丰富的图标库和模板&#xff0c;让您在定制文件夹图标时更加得心应手。Folder Icons for Mac 不仅能…

react 图片没有加载出来的问题

react 图片没有加载出来的问题 我原来是这样写的 <Layout><Sider><imgsrc"../images/login/topdivbg20221202.png"/></Sider><Content><Menu onClick{onClick} selectedKeys{[current]} mode"horizontal" it…

欣赏一个尚未关闭的python运行时bug

这是一个语言的运行时错误&#xff0c;在linux环境&#xff0c;跨语言使用共享内存时&#xff0c;会触发。它会在python程序退出时&#xff0c;自行销毁sharedMemory&#xff0c;即便此时还有其他的进程在使用——这会让C/Python跨进程调用几乎没有办法进行。 python程序运行完…

华为、小米、魅族都开始造车了!中国还有多少手机厂家要下场造车?2024如果创业适合干什么?2024最适合创业的细分行业

要说现在中国最火、声量最高的创业是什么&#xff1f;那一定是造车&#xff01; 小米这样的手机公司在造车、创维这样的电视家电品牌在造车、甚至就连五粮液这样的白酒品牌也在造车&#xff01;至于其他的还有什么做地产的恒大、做电动车的新日等等&#xff0c;数不数胜。而在手…

数据结构~~带环链表的环开始的节点位置**两种方法

1.带环链表环开始的位置 &#xff08;1&#xff09;上面的这个测试用例使用的是包含了4个节点的带环链表&#xff0c;我们要找的就是链表里面的环开始的节点的位置&#xff0c;拿这个测试用例而言&#xff0c;就是2这个节点&#xff0c;从这个节点开始&#xff0c;我们的链表就…

Shopee、Lazada等平台怎么做测评?

最近有很多人咨询南哥跨境电商平台测评应该怎么做&#xff0c;今天我就针对东南亚站点&#xff0c;详细跟大家分享一下东南亚平台测评需要哪些资源 测评环境系统 不管做任何平台&#xff0c;首先你要有一个稳定的测评环境系统&#xff0c;测评环境系统的底层逻辑就是通过一台…

【Uniapp】图片修复对比组件

效果图 不废话&#xff0c;直接上源码&#xff01; 组件直接用 <template><viewclass"img-comparison-container":style"width: width rpx;height: height rpx"><view class"before-image" :style"width: x rpx&quo…

两大DRAM巨头20%产能转给HBM

随着人工智能(AI)需求的激增&#xff0c;全球领先的内存芯片制造商三星(Samsung)和SK海力士(SK Hynix)预计&#xff0c;由于高性能芯片需求不断增长&#xff0c;今年DRAM和高带宽内存(HBM)的价格将保持强劲。据《韩国经济日报》报道&#xff0c;三星和SK海力士已将其超过20%的D…

实验12:综合实验

1、实验目的及要求&#xff1a; 通过本次实验完成一个小型网络中配置设备。实现配置一个路由器、两个交换机和两台PC&#xff0c;以支持IPv4和IPv6连接&#xff1b;路由器和交换机必须安全管理&#xff0c;配置VLAN间路由、DHCP、以太网通道和端口安全。通过登录思科网络技术学…

Beego 使用教程 6:Web 输入处理

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发&#xff0c;包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado&#xff0c; Sinatra 和 Flask beego 官网&#xff1a;http://beego.gocn.vip/ 上面的 bee…

⭐解读绍兴BSCI验厂攻略⭐

&#x1f308;解读&#x1f50d;绍兴BSCI验厂攻略&#x1f308; &#x1f60a;深入解读&#x1f449;绍兴BSCI验厂攻略&#x1f448;&#xff0c;助力企业&#x1f481;‍♂️顺利通过国际认证&#x1f990; &#x1f497;在全球化日益&#x1f9ed;加速的今天&#xff0c;&…

我的职场加速器-高效工作从可道云teamOS开始

不论是作为管理者&#xff0c;还是普通打工人&#xff0c;在日常工作中&#xff0c;我们都需要一款既能够保障数据安全&#xff0c;又能够提升团队协作效率的平台。 近期&#xff0c;我体验了可道云teamOS&#xff0c;这款企业级云协作平台给我留下了深刻的印象。 一、极简风…

Pytorch代码基础—张量

Pytorch代码—张量 Pytorch张量 张量的属性&#xff1a; data&#xff1a;被包装的Tensorgrad&#xff1a;data的梯度grad_fn:创建Tensor的Function&#xff0c;是自动求导的关键requires_grad&#xff1a;指示是否需要梯度isleaf&#xff1a;指示是否是叶子结点&#xff0…

SpringBoot应用

文章目录 第一章、SpringBoot基础内容一、Spring和SpringBoot1、Spring介绍2、SpringBoot介绍 二、SpringBoot2入门操作1、在线构建2、idea构建 三、浅谈自动装配的原理 第二章、SpringBoot核心功能一、配置文件1、配置文件介绍2、语法规则3、数据类型4、案例使用 二、WEB开发1…

JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 ⭐️ 引言&#x1f3af; 变量提升(Hoisting)&#x1f47b; 暂时性死区&#xff08;Temporal Dead Zone, TDZ&#xff09;解释&#x1f4e6; var声明&#x1f512; let与const声明&#x1f4d6; 函数声明 与 函数表达式函数声…

【案例教程】土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测

查看原文>>>土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测 土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译&#xff0c;可获取历史或当前任何一个区域的土地利用/土地覆盖数据&#xff0c;用于评估区域的生…

U盘制作PE后容量少了一半,如何恢复默认空间

格式化U盘 以前制作U盘PE后&#xff0c;从原本64G的容量变成了32G&#xff0c;一直也没去关注处理。 恰巧这两天又遇到U盘无法识别&#xff0c;数据无法读取&#xff0c;想着格式化恢复。 很遗憾&#xff0c;发现利用电脑快速格式化依然无法直接拿到空闲的另一半空间。 磁盘管…

[图解]SysML和EA建模住宅安全系统-03

1 00:00:00,490 --> 00:00:01,180 怎么加 2 00:00:01,570 --> 00:00:04,380 我们来看&#xff0c;这是刚才那个图 3 00:00:05,200 --> 00:00:06,390 17.7 4 00:00:07,150 --> 00:00:08,260 我们同样在这里加 5 00:00:08,430 --> 00:00:10,100 同样在这个下面…