【问题标题】:What's the difference between C# SHA256Managed and cryptopp::SHA256C# SHA256Managed 和 cryptopp::SHA256 有什么区别
【发布时间】:2012-10-15 01:09:37
【问题描述】:

我正在尝试用 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,0xb1, 0xac,0xc4,0x27,0x8e,0x88

密钥 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 有什么区别导致这个结果?

【问题讨论】:

    标签: cryptography sha sha256 crypto++


    【解决方案1】:

    在我看来,您的代码中存在错误。

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

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

    【讨论】:

    • 我在 memcpy(key_seed, truncated_key_seed, sizeof(key_seed)) 中犯了一个愚蠢的错误;应该是 memcpy( truncated_key_seed, key_seed, sizeof(key_seed) );
    • 感谢您的提示!猫头鹰。我应该注意细节,而不是怀疑整个世界。 :-)
    猜你喜欢
    • 2013-12-07
    • 2016-03-06
    • 1970-01-01
    • 2011-04-05
    • 2019-03-08
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多