c++ - 打印: Displaying an SHA1 hash in hexadecimal

标签 c++ windows sha1 cryptoapi

我一直在关注 msdn 示例,该示例演示了如何使用 Windows CryptoAPI 对数据进行哈希处理。该示例可以在这里找到: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");
}

如果有人能为我解释一下,我将不胜感激,提前致谢:)

最佳答案

x >> 4x 右移四位。 x & 0xfx0xf 之间执行按位 and。 0xf 设置了四个最低有效位,并清除所有其他位。

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

四位正好适合一个十六进制数字,因此其中每一位都用于在数组中查找十六进制数字,该数组大概如下所示:

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

关于c++ - 打印: Displaying an SHA1 hash in hexadecimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529744/

相关文章:

c++ - 隐式转换,如shared_ptr<T>

php - 磁盘上文件的随机名称 sha1 或 uniqid 哪个更好?

c++ - 指针 vector 的复制构造函数

c++ - 为什么我不能将 std::unique_ptr 用作 "template<class> class"参数?

c++ - 如何在 Windows 中的特定显示器上打开一个窗口?

windows - golang程序不适用于Windows服务

linux - 无法在 Windows 7 中删除 Linux 生成的文件

php - 可以破解 sha1(md5 ('password' )) 密码吗?

android - SHA 和 SHA1 证书如何像 Facebook 一样在您的 Android 应用程序上保护 API?

c++ - CUDA 在使用函数指针时将主机函数作为内核启动