首页 > 其他分享 >在 Blazor WASM 中手撸一个.NET MD5类

在 Blazor WASM 中手撸一个.NET MD5类

时间:2023-11-25 14:13:20浏览次数:40  
标签:case 16 中手 Length uint num12 input WASM Blazor

最近.net8 blazor auto大火, 我也玩了一下,发现ssr能用的代码 MD5 类在wasm是没法用的. 于是搜索了一下互联网,找到了一份代码,分享给大家.

我找到的帖子作者原话: 代码不是我的,但我确实稍微修改了它以使其与 System.Security.Cryptography.MD5 类更加一致。

public static class MD5
{
    public static byte[] ComputeHash(byte[] input)
    {
        uint num = 1732584193u;
        uint num2 = 4023233417u;
        uint num3 = 2562383102u;
        uint num4 = 271733878u;
        int num5 = (56 - (input.Length + 1) % 64) % 64;
        byte[] array = new byte[input.Length + 1 + num5 + 8];
        Array.Copy(input, array, input.Length);
        array[input.Length] = 128;
        Array.Copy(BitConverter.GetBytes(input.Length * 8), 0, array, array.Length - 8, 4);
        for (int i = 0; i < array.Length / 64; i++)
        {
            uint[] array2 = new uint[16];
            for (int j = 0; j < 16; j++)
            {
                array2[j] = BitConverter.ToUInt32(array, i * 64 + j * 4);
            }

            uint num6 = num;
            uint num7 = num2;
            uint num8 = num3;
            uint num9 = num4;
            uint num10 = 0u;
            uint num11 = 0u;
            uint num12 = 0u;
            while (true)
            {
                switch (num12)
                {
                    case 0u:
                    case 1u:
                    case 2u:
                    case 3u:
                    case 4u:
                    case 5u:
                    case 6u:
                    case 7u:
                    case 8u:
                    case 9u:
                    case 10u:
                    case 11u:
                    case 12u:
                    case 13u:
                    case 14u:
                    case 15u:
                        num10 = num7 & num8 | ~num7 & num9;
                        num11 = num12;
                        goto IL_0138;
                    case 16u:
                    case 17u:
                    case 18u:
                    case 19u:
                    case 20u:
                    case 21u:
                    case 22u:
                    case 23u:
                    case 24u:
                    case 25u:
                    case 26u:
                    case 27u:
                    case 28u:
                    case 29u:
                    case 30u:
                    case 31u:
                    case 32u:
                    case 33u:
                    case 34u:
                    case 35u:
                    case 36u:
                    case 37u:
                    case 38u:
                    case 39u:
                    case 40u:
                    case 41u:
                    case 42u:
                    case 43u:
                    case 44u:
                    case 45u:
                    case 46u:
                    case 47u:
                    case 48u:
                    case 49u:
                    case 50u:
                    case 51u:
                    case 52u:
                    case 53u:
                    case 54u:
                    case 55u:
                    case 56u:
                    case 57u:
                    case 58u:
                    case 59u:
                    case 60u:
                    case 61u:
                    case 62u:
                    case 63u:
                        if (num12 >= 16 && num12 <= 31)
                        {
                            num10 = num9 & num7 | ~num9 & num8;
                            num11 = (5 * num12 + 1) % 16u;
                        }
                        else if (num12 >= 32 && num12 <= 47)
                        {
                            num10 = num7 ^ num8 ^ num9;
                            num11 = (3 * num12 + 5) % 16u;
                        }
                        else if (num12 >= 48)
                        {
                            num10 = num8 ^ (num7 | ~num9);
                            num11 = 7 * num12 % 16u;
                        }

                        goto IL_0138;
                }

                break;
            IL_0138:
                uint num13 = num9;
                num9 = num8;
                num8 = num7;
                num7 += leftRotate(num6 + num10 + K[num12] + array2[num11], s[num12]);
                num6 = num13;
                num12++;
            }

            num += num6;
            num2 += num7;
            num3 += num8;
            num4 += num9;
        }
        var hashBytes = new byte[16];
        BitConverter.GetBytes(num).CopyTo(hashBytes, 0);
        BitConverter.GetBytes(num2).CopyTo(hashBytes, 4);
        BitConverter.GetBytes(num3).CopyTo(hashBytes, 8);
        BitConverter.GetBytes(num4).CopyTo(hashBytes, 12);
        return hashBytes;
    }
    public static string ComputeHashString(byte[] input) => string.Join("", ComputeHash(input).Select(o => o.ToString("x2")));

    private static int[] s = new int[64]
    {
        7, 12, 17, 22, 7, 12, 17, 22, 7, 12,
        17, 22, 7, 12, 17, 22, 5, 9, 14, 20,
        5, 9, 14, 20, 5, 9, 14, 20, 5, 9,
        14, 20, 4, 11, 16, 23, 4, 11, 16, 23,
        4, 11, 16, 23, 4, 11, 16, 23, 6, 10,
        15, 21, 6, 10, 15, 21, 6, 10, 15, 21,
        6, 10, 15, 21
    };

    private static uint[] K = new uint[64]
    {
        3614090360u, 3905402710u, 606105819u, 3250441966u, 4118548399u, 1200080426u, 2821735955u, 4249261313u, 1770035416u, 2336552879u,
        4294925233u, 2304563134u, 1804603682u, 4254626195u, 2792965006u, 1236535329u, 4129170786u, 3225465664u, 643717713u, 3921069994u,
        3593408605u, 38016083u, 3634488961u, 3889429448u, 568446438u, 3275163606u, 4107603335u, 1163531501u, 2850285829u, 4243563512u,
        1735328473u, 2368359562u, 4294588738u, 2272392833u, 1839030562u, 4259657740u, 2763975236u, 1272893353u, 4139469664u, 3200236656u,
        681279174u, 3936430074u, 3572445317u, 76029189u, 3654602809u, 3873151461u, 530742520u, 3299628645u, 4096336452u, 1126891415u,
        2878612391u, 4237533241u, 1700485571u, 2399980690u, 4293915773u, 2240044497u, 1873313359u, 4264355552u, 2734768916u, 1309151649u,
        4149444226u, 3174756917u, 718787259u, 3951481745u
    };

    private static uint leftRotate(uint x, int c)
    {
        return x << c | x >> 32 - c;
    }
}

不得不说,真香.

参考来源

https://stackoverflow.com/questions/76728300/any-net-md5-library-nuget-for-blazor-webassembly

标签:case,16,中手,Length,uint,num12,input,WASM,Blazor
From: https://www.cnblogs.com/densen2014/p/17855463.html

相关文章

  • .NET8 Blazor新特性 流式渲染
    什么是SSRBlazor中的流式渲染结合了SSR(服务端渲染),服务端将HTML拼好返回给前端,有点像我们熟知的RazorPages或MVC。当已经有了RazorPages或MVC时,为什么还要选择使用Blazor来实现这一点?这里有几个原因。首先,RazorPages和MVC没有像Blazor这样提供了很好的可重用组......
  • MAUI + MASA Blazor .NET8 升级指南
    目录前言准备1、首先确保已经将VS升级到VisualStudio202217.8版本以上。2、下载安装.NET8.0升级项目1、将项目的目标.NET运行时修改为net8.02、添加依赖包引用3、升级依赖包4、升级Xcode5、测试打包前言Net8修复了MAUI中的很多Bug,还增加了很多新功能,例如:AndroidStripILAft......
  • Photino.Blazor 升级.net8.0 记事
    趁着Photino.Blazor作者还没升级.net8之际,我发布版将photino.Blazor-2.6.0发布版升级到.Net8。1首先下载photino.Blazor-2.6.0的发布版https://github.com/tryphotino/photino.Blazor/releases/tag/v2.6.02。将所有项目升级最新.net8.0 3.将引用包都升级到最新版,重点是......
  • wasmedge 轻量&可扩展&可移植的webassembly 运行时
    wasmedge是一个cncf的沙箱项目,提供了一个强大的webassembly运行时包含的特性高性能 利用了llvm进行AOT编译优化云原生的扩展 提供了非阻塞的网络以及webservice能力的rust,c,jssdk,包含了mysql数据库驱动,keyvalue存储,同时包含了ai的推理支持提供了比较完备的js支......
  • Sealos 云操作系统一键集成 runwasi,解锁 Wasm 的无限潜力
    WebAssembly(通常缩写为Wasm)是一种为网络浏览器设计的低级编程语言。它旨在提供一种比传统的JavaScript更快、更高效的方式来执行代码,以弥补JavaScript在性能方面的不足。通过使用二进制格式,WebAssembly能够提供比传统JavaScript更快的解析和执行速度。原文链接:https......
  • Golang简单使用wasm
    go代码packagemainimport( "syscall/js")funcaddxxxx(thisjs.Value,args[]js.Value)interface{}{ iflen(args)!=2{ return"Invalidnumberofarguments.Expected2." } num1:=args[0].Float() num2:=args[1].Float() res......
  • wasm-vips libvips webassembly 实现
    wasm-vips是利用了emscripten将libvips编译为webassembly可以实现在node以及浏览器中使用libvips强大的图片处理处理以下是一个简单的试用参考试用app.js constVips=require('wasm-vips'); asyncfunctioninit(){constvips=awaitVips......
  • 基于 tesseract-wasm+ fastify 开发一个简单的中文ocr 服务
    以前我简单介绍过tesseract-wasm,基于此wasm包我们可以直接基于nodejs调用tesseract的方法实现ocr处理,以下是一个简单的demo基于fastify开发了一个简单的api,同时包含了一个简单的web可以测试项目结构package.json {"name":"tesseract","versio......
  • tesseract-wasm 基于webassembly 的tesseract npm 包
    tesseract是一个开源的ocr工具,社区提供可一个基于webassembly的tesseract-wasm,可以方便直接基于浏览器的ocr识别以下是一个简单的试用项目代码package.json {"name":"tesseract","version":"1.0.0","main":"index.js"......
  • opencv wasm 试用
    基于webassembly的opencvnodejs开发是一个很不错的体验,不用考虑nodeaddon的各种问题,而且性能也不错以下是基于echamudi/opencv-wasm构建的4.8.1版本的试用,代码来自opencv-wasm的示例demo试用pacakge.json {"name":"opencv-wasm","version":......