C# Crc32 实现

Max*_*ann 3 c# crc32 cryptography mifare desfire

I\xc2\xb4ve 得到以下示例:

\n
3D020000000F0000112233445566778899AABBCCDDEEFF - Crc32 Input\n280ACDA5 - Crc32 Result\n
Run Code Online (Sandbox Code Playgroud)\n

但使用以下计算器:sunshine2kzorc.breitbandkatze我可以\xc2\xb4t 重建结果。该文档说: Polynomial- 04C11DB7、 Reverse- EDB88320、 Initvalue-FFFFFFFF以及 Result 不应反转。

\n

我\xc2\xb4ve在NuGet上搜索库并找到了Nito,但也没有得到正确的结果。04C11DB7I\xc2\xb4ve 还尝试了标志和多项式 ( , )的每种组合EDB88320

\n

有人可以告诉我\xc2\xb4m 做错了什么吗?计算器和库是否错误?另外,我\xc2\xb4ve在两侧和lib上尝试了相同的polinom和标志组合,但得到了不同的结果:-(有人可以告诉lib哪个绝对是正确的吗?

\n

这是我的测试代码:

\n
        [Theory]\n        [InlineData("3D 00 00 00 00 10 00 00 23 00 00 00 00 00 00 08 12 34 56 78 00 00 00 00", "7B 8A 60 0F")]\n        [InlineData("3D020000000F0000112233445566778899AABBCCDDEEFF", "280ACDA5")]\n        public void Crc32_Test(string input, string assumedCrc32)\n        {\n            var definition = new Definition\n            {\n                Initializer = 0xFFFFFFFF,\n                TruncatedPolynomial = 0xEDB88320,\n                ReverseResultBeforeFinalXor = false,\n                ReverseDataBytes = false,\n            };\n\n            var whow = new Nito.HashAlgorithms.CRC32(definition);\n\n            var inputArray = DESFireSessionHandler.StringToByte(input);\n            var assumedCrc32Array = DESFireSessionHandler.StringToByte(assumedCrc32);\n\n            var crc32 = whow.ComputeHash(inputArray);\n\n            if (crc32.SequenceEqual(assumedCrc32Array))\n                Assert.True(true);\n            else if (crc32.Reverse().SequenceEqual(assumedCrc32Array))\n                Assert.True(true);\n            else Assert.False(true);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Top*_*aco 5

以下参数产生所需的结果 280ACDA5:

Initializer = 0xFFFFFFFF,
TruncatedPolynomial = 0x04C11DB7,
FinalXorValue = 0x00000000,
ReverseResultBeforeFinalXor = true,
ReverseDataBytes = true
Run Code Online (Sandbox Code Playgroud)

这与在线工具相同(字节顺序除外):

https://crccalc.com/

在此输入图像描述

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

在此输入图像描述


完整的C#代码是:

using System;
using static Nito.HashAlgorithms.CRC32;
                    
public class Program
{
    public static void Main()
    {
        var definition = new Definition
        {
            Initializer = 0xFFFFFFFF,
            TruncatedPolynomial = 0x04C11DB7,
            FinalXorValue = 0x00000000,
            ReverseResultBeforeFinalXor = true,
            ReverseDataBytes = true
        };

        var inputHex = "3D020000000F0000112233445566778899AABBCCDDEEFF";
        var input = Convert.FromHexString(inputHex);
        var whow = new Nito.HashAlgorithms.CRC32(definition);
        
        var crc32 = whow.ComputeHash(input);
        var crc32Hex = Convert.ToHexString(crc32);
        Console.WriteLine(crc32Hex); // 280ACDA5
    }
}
Run Code Online (Sandbox Code Playgroud)