【问题标题】:printf: Displaying an SHA1 hash in hexadecimalprintf:以十六进制显示 SHA1 哈希
【发布时间】:2012-07-17 19:42:50
【问题描述】:

我一直在关注显示如何使用 Windows CryptoAPI 对数据进行哈希处理的 msdn 示例。该示例可以在这里找到:http://msdn.microsoft.com/en-us/library/windows/desktop/aa382380%28v=vs.85%29.aspx

我已修改代码以使用 SHA1 算法。

我不明白以十六进制显示哈希(如下所示)的代码是如何工作的,更具体地说,我不明白 >> 4 运算符和 & 0xf 运算符的作用。

if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)){
    printf("MD5 hash of file %s is: ", filename);
    for (DWORD i = 0; i < cbHash; i++)
    {
        printf("%c%c", rgbDigits[rgbHash[i] >> 4],
           rgbDigits[rgbHash[i] & 0xf]);
    }
    printf("\n");
}

如果有人能为我解释一下,我将不胜感激,在此先感谢:)

【问题讨论】:

  • 它们分别被称为按位右移运算符和按位与运算符。您可以查看他们的工作,因为这是基本的位操作,应该可以回答您的问题。

标签: c++ windows sha1 cryptoapi


【解决方案1】:

x &gt;&gt; 4 将x 右移四位。 x &amp; 0xf 在x 和0xf 之间按位执行and。 0xf 设置了四个最低有效位,所有其他位都清除。

假设rgbHash 是一个无符号字符数组,这意味着第一个表达式仅保留四个最高有效位,第二个表达式保留(大概)8 位输入的四个最低有效位。

四位恰好适合一个十六进制数字,因此每个位都用于在数组中查找一个十六进制数字,大概看起来像这样:

char rgbDigits[] = "0123456789abcdef"; // or possibly upper-case letters

【讨论】:

    【解决方案2】:

    此代码使用简单的位“过滤”技术

    • “>> 4”表示右移4位,即“除以16”
    • "& 0xf" 等于位与运算,意思是“取前 4 位”

    这两个值都被传递给 rgbDigits,从而在有效范围内产生输出 - 人类可读

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2020-01-22
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多