我有一个 SHA1 哈希值,我需要对其进行签名。CryptSignHash() 方法需要 HCRYPTHASH 句柄进行签名。我创建它,因为我已经有了实际的哈希值然后设置它:
CryptCreateHash(cryptoProvider, CALG_SHA1, 0, 0, &hash);
CryptSetHashParam(hash, HP_HASHVAL, hashBytes, 0);
hashBytes 是一个 20 字节的数组。
然而问题是这个 HCRYPTHASH 句柄产生的签名是不正确的。我将问题追溯到这样一个事实,即 CAPI 实际上并没有使用我的 hashBytes 数组中的所有 20 个字节。由于某种原因,它认为 SHA1 只有 4 个字节。
为了验证这一点,我编写了这个小程序:
HCRYPTPROV cryptoProvider;
CryptAcquireContext(&cryptoProvider, NULL, NULL, PROV_RSA_FULL, 0);
HCRYPTHASH hash;
HCRYPTKEY keyForHash;
CryptCreateHash(cryptoProvider, CALG_SHA1, keyForHash, 0, &hash);
DWORD hashLength;
CryptGetHashParam(hash, HP_HASHSIZE, NULL, &hashLength, 0);
printf("hashLength: %d\n", hashLength);
这会打印出 hashLength: 4 !
谁能解释我做错了什么或为什么 Microsoft CAPI 认为 SHA1 是 4 字节(32 位)而不是 20 字节(160 位)。