cryptography - C# SHA256Managed 和 cryptopp::SHA256 有什么区别

标签 cryptography sha sha256 crypto++

我正在尝试用 cryptopp::SHA256 替换 MS SHA256Managed 函数。 这是 C# 代码

internal byte[] GenerateKey(byte[] keySeed, Guid keyId)
{
        byte[] truncatedKeySeed = new byte[30];
        Array.Copy(keySeed, truncatedKeySeed, truncatedKeySeed.Length);
        Console.WriteLine("Key Seed");
        foreach (byte b in truncatedKeySeed)
        {
            Console.Write("0x" + Convert.ToString(b, 16) + ",");
        }
        Console.WriteLine();
        //
        //  Get the keyId as a byte array
        //
        byte[] keyIdAsBytes = keyId.ToByteArray();
        SHA256Managed sha_A = new SHA256Managed();
        sha_A.TransformBlock(truncatedKeySeed, 0, truncatedKeySeed.Length, truncatedKeySeed, 0);
        sha_A.TransformFinalBlock(keyIdAsBytes, 0, keyIdAsBytes.Length);

        byte[] sha_A_Output = sha_A.Hash;
        Console.WriteLine("sha_a:" + sha_A_Output.Length);
        foreach (byte b in sha_A_Output)
        {
            Console.Write("0x" + Convert.ToString(b, 16) + ",");
        }
        Console.WriteLine(); 
        .....
}

输出结果:

关键种子 0x5d,0x50,0x68,0xbe,0xc9,0xb3,0x84,0xff,0x60,0x44,0x86,0x71,0x59,0xf1,0x6d,0x6b,0x75,0x55,0x44,0xfc,0xd5,0x11,0x69,0x89,0xb 1、 0xac,0xc4,0x27,0x8e,0x88

key ID 0x39,0x68,0xe1,0xb6,0xbd,0xee,0xf6,0x4f,0xab,0x76,0x8d,0x48,0x2d,0x8d,0x2b,0x6a,

sha_a:32 0x7b,0xec,0x8f,0x1b,0x60,0x4e,0xb4,0xab,0x3b,0xb,0xbd,0xb8,0x71,0xd6,0xba,0x71,0xb1,0x26,0x41,0x7d,0x99,0x55,0xdc,0x8e,0x64, 0x76,0x15,0x23,0x1b,0xab,0x76,0x62,

Crypto++的替换函数如下:

  byte key_seed[] = { 0x5D, 0x50, 0x68, 0xBE, 0xC9, 0xB3, 0x84, 0xFF, 0x60, 0x44, 0x86, 0x71, 0x59, 0xF1, 0x6D, 0x6B, 0x75, 0x55, 0x44, 0xFC,0xD5, 0x11, 0x69, 0x89, 0xB1, 0xAC, 0xC4, 0x27, 0x8E, 0x88 };
  byte key_id[] = { 0x39,0x68,0xe1,0xb6,0xbd,0xee,0xf6,0x4f,0xab,0x76,0x8d,0x48,0x2d,0x8d,0x2b,0x6a };
  byte truncated_key_seed[sizeof(key_seed)];
  memset( truncated_key_seed,0,sizeof(truncated_key_seed));
  memcpy( key_seed, truncated_key_seed, sizeof(key_seed) );
  byte output[SHA256::DIGESTSIZE];
  memset(output,0,sizeof(output));

  SHA256 sha_a;
  sha_a.Update(truncated_key_seed,sizeof(key_seed));
  sha_a.Update(key_id,sizeof(key_id));
  sha_a.Final(output);
  printf("size:%lu\n",sizeof(output));
  PrintHex(output,sizeof(output));

但是输出的哈希值是 DB 36 C9 F6 F7 29 6D 6F 52 21 DA 9F 55 1D AE BC 3E 5A 15 DF E1 37 07 EE 8F BC 73 61 5F D6 E1 C3 与C#的sha_a结果不同。

来自MSDNCryptopp reference ,SHA256Managed::TransformBlock 和 SHA256Managed::TransformFinalBlock 对 Cryptopp::Update 和 Cryptopp::Final 做了同样的事情。

SHA256Managed 和 cryptopp::SHA256 之间的区别是什么导致了这个结果?

最佳答案

对我来说,这似乎是你的代码中的一个错误。

  sha_a.Update(truncated_key_seed,sizeof(key_seed));

确保两个版本中的 truncated_key_seed 相同,尤其是原始 key_seed 中未包含的字节...

关于cryptography - C# SHA256Managed 和 cryptopp::SHA256 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880923/

相关文章:

c++ - 如何使用arc4输入字符串进行加密?

algorithm - 哪种哈希算法最适合字符串的唯一性和速度?

git - cherry-pick 提交并保留原始 SHA 代码

Java SHA256 输出不同的散列到 PHP SHA256?

security - 使用 sha256 的登录 token

java - RSA 加密 2 个客户端之间共享数据

swift - Xcode Commoncrypto 生成 key 对(私钥和公钥)

c - 使用 mbedlts 在内存受限的系统上使用 SHA 散列文件

java - 将安全 token 功能从 C# 重新创建为 Java

c - RSA 加密的 OpenSSL 可变长度结果 [C 编程]