【问题标题】:Digital signature made in C# does not verify in C++用 C# 制作的数字签名在 C++ 中不验证
【发布时间】:2013-04-15 12:41:23
【问题描述】:

我有一个使用 RSA 对数据进行数字签名的 C# 应用程序。代码如下:

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“尝试引用不存在的令牌”。生成新密钥失败并出现同样的错误。

【问题讨论】:

    标签: c# c++ rsa digital-signature cryptoapi


    【解决方案1】:

    经过逐字节检查,我得到了它的工作。 C# 应用程序中有两个问题。

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

    CspParameters parameters = new CspParameters();
    parameters.KeyNumber = (int)KeyNumber.Signature;
    
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(RsaKeySize, parameters);
    

    2) RSACryptoServiceProvider 反转其输出(签名、加密数据)。在documentation 中提到了它。所以你需要在保存之前Array.Reverse()计算的签名。

    【讨论】:

    • 我知道你的帖子已经有几年了,但感谢这篇很棒的帖子。在到达这里之前,我也遇到了同样的问题。不敢相信 .NET 和非托管 CryptoApi 不能就字节排序这样基本的东西达成一致。您为我节省了数小时的挖掘和整体挫败感!
    • 很高兴能帮上忙。
    • 这对我也很有帮助,但我完全在 c# 中。我正在使用ImportCspBlob 方法,所以我显然必须提供我自己的参数,包括KeyNumber。如果我没有指定 blob 用于签名,则生成的签名会静默失败。
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2014-02-24
    • 2011-08-18
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多