我有一个 C# 应用程序,它使用 RSA 对数据进行数字签名。代码如下:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(privateKeyBlob);
SHA1 sha1 = new SHA1CryptoServiceProvider();
sha1.ComputeHash(myData);
byte[] signature = rsa.SignHash(sha1.Hash, CryptoConfig.MapNameToOID("SHA1"));
我无法验证 C++ 中的签名。代码如下:
HCRYPTPROV cryptProvider;
CryptAcquireContext(&cryptProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
// PROV_RSA_SIG does not work
HCRYPTKEY publicKey;
CryptImportKey(cryptProvider, publicKeyBlob, publicKeyBlobLength, 0, 0, &publicKey);
HCRYPTHASH hash;
CryptCreateHash(cryptProvider, CALG_SHA1, 0, 0, &hash);
CryptHashData(hash, myData, myDataLength, 0);
BOOL isSigOk = CryptVerifySignature(hash, signature, signatureLength, publicKey, NULL, CRYPT_NOHASHOID);
验证返回0,GetLastError()
返回2148073478“无效签名”。哈希是相同的。我试过有和没有CRYPT_NOHASHOID
标志。
我尝试用 C++ 对数据进行签名(只是为了比较结果)。我删除了CRYPT_VERIFYCONTEXT
旗帜。但是导入私钥 BLOB 失败并显示 1008“尝试引用不存在的令牌”。生成新密钥失败并出现相同的错误。