【发布时间】: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;
}
【问题讨论】: