【问题标题】:Using an SHA1 with Microsoft CAPI将 SHA1 与 Microsoft CAPI 结合使用
【发布时间】:2010-05-28 09:49:38
【问题描述】:

我有一个 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 位)。

【问题讨论】:

    标签: c cryptoapi


    【解决方案1】:

    您的代码中有一个小错误。而不是

    DWORD hashLength;
    CryptGetHashParam(hash, HP_HASHSIZE, NULL, &hashLength, 0);
    printf("hashLength: %d\n", hashLength);
    

    你应该使用

    DWORD hashLength, hashSize;
    hashLength = sizeof(DWORD)
    CryptGetHashParam(hash, HP_HASHSIZE, (PBYTE)&hashSize, &hashLength, 0);
    printf("hashSize: %d\n", hashSize);
    

    那么您将按预期收到 20 个。

    CryptSignHashCryptSetHashParam 之后的用法也必须有效。请参阅http://msdn.microsoft.com/en-us/library/aa380270(VS.85).aspxCryptSetHashParam 函数描述末尾的备注。我想您在检索签名结果期间犯了与CryptGetHashParam(..., HP_HASHSIZE, ...) 相同的错误。将您的代码与CryptSignHash函数http://msdn.microsoft.com/en-us/library/aa380280(VS.85).aspx的描述中的代码进行比较。

    【讨论】:

      【解决方案2】:

      我认为您不能以这种方式使用CryptCreateHash。来自MSDN

      "CryptCreateHash 函数 启动一个流的散列 数据。”

      换句话说,您似乎无法以除空之外的任何方式实例化散列上下文(然后通过散列输入数据)。

      您目前如何拥有哈希 - 字节数组?如果是这样,您可能只想签署该数组;我会调查 CryptSignMessageCryptSignMessageWithKey 是否有可能完成这项工作。

      (我猜,但您所看到的可能是因为在哈希上下文完成一些工作之后才设置输出哈希长度。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多