-->

在C#中做数字签名不是用C ++验证(Digital signature made in C# do

2019-08-31 06:28发布

我有一个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“试图引用不存在的令牌”失败。 生成一个新的密钥失败,同样的错误。

Answer 1:

按字节检查辛苦字节后,我得到了它的工作。 有在C#应用程序的两个问题。

1)I使用new RSACryptoServiceProvider(RsaKeySize)以生成一个密钥对。 问题是,这会产生密钥交换密钥对,而不是签名。 C#不介意,但它引起了C ++程序的麻烦。 用于生成密钥对正确的方法是:

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

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(RsaKeySize, parameters);

2) RSACryptoServiceProvider反转其输出(签名,加密的数据)。 这是中提到的文档 。 所以,你需要Array.Reverse()保存之前计算的签名。



文章来源: Digital signature made in C# does not verify in C++