【问题标题】:CryptSignHash Error 2148073494 "Keyset does not exist"?CryptSignHash 错误 2148073494 “密钥集不存在”?
【发布时间】:2015-03-18 00:15:08
【问题描述】:

我正在使用一种叫做 CA-Visual Objects 的奇怪语言。我正在尝试验证我在 C# 中创建的哈希签名。但是在调用 CryptSignHash 函数时,我得到错误代码 2148073494,我认为它映射到“密钥集不存在”。

CryptAcquireContext( @hCryptProvider, NULL_PTR, NULL_PTR, PROV_RSA_FULL, 0) //returns true
CryptCreateHash(hCryptProvider, CALG_SHA1, 0, 0, @hHash) //returns true
CryptHashData(hHash, pData, dwDataLen, 0) //returns true
CryptImportKey(hCryptProvider, pKeyBlob, cbKeyBlob, 0, 0, @hKey) //returns true
CryptSignHashA(hHash, AT_SIGNATURE, null, 0, NULL, @dwSignLen) //returns false with error code 2148073494 

我对这个 API 不是很熟悉,有人能告诉我什么“Keyset”不存在吗?是 AT_SIGNATURE 吗?还是别的什么?

这是对数据进行签名的 C# 代码:

 private static void CreateSigningKey()
    {
        CspParameters p = new CspParameters();
        p.KeyNumber = (int)KeyNumber.Signature;

        using (RSACryptoServiceProvider rsaCreateSigningKey = new RSACryptoServiceProvider(2048, p))
        {
            rsaCreateSigningKey.PersistKeyInCsp = false;
            var parameters = rsaCreateSigningKey.ExportParameters(false);
            byte[] ex = parameters.Exponent;
            byte[] mod = parameters.Modulus;
            File.WriteAllBytes(publicSigningKeyPathMod, mod);
            File.WriteAllBytes(publicSigningKeyPathExp, ex);
            File.WriteAllText(privateSigningKeyPath, rsaCreateSigningKey.ToXmlString(true));
        }
    }


private static string Sign(byte[] plainBytes)
    {
        string signatureText;

        CspParameters parameters = new CspParameters();
        parameters.KeyNumber = (int) KeyNumber.Signature;

        using (RSACryptoServiceProvider rsaSign = new RSACryptoServiceProvider(2048)) //signing with private sign key
        {
            rsaSign.PersistKeyInCsp = false;
            rsaSign.FromXmlString(File.ReadAllText(privateSigningKeyPath)); //private sign key is held here at BP

            SHA1Managed hash = new SHA1Managed();
            byte[] hashByte = hash.ComputeHash(plainBytes);

            RSAPKCS1SignatureFormatter signFormatter = new RSAPKCS1SignatureFormatter(rsaSign);
            signFormatter.SetHashAlgorithm("SHA1");
            byte[] signature = signFormatter.CreateSignature(hashByte);

            signatureText = Convert.ToBase64String(signature);
        }
        return signatureText;
    }

【问题讨论】:

    标签: c# hash rsa cryptoapi


    【解决方案1】:

    问题确实是您所怀疑的AT_SIGNATURE 参数:CryptImportKey 将创建一个具有 keySpec 的密钥,该密钥取决于输入密钥 blob 参数,在您的情况下,密钥 blob 与 AT_KEYEXCHANGE 相关联。因此,您的问题的解决方法是在 CryptSignHash 调用中指定 AT_KEYEXCHANGE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      相关资源
      最近更新 更多