加密API函数等价于C#

本文关键字:等价于 函数 API 加密 | 更新日期: 2023-09-27 17:59:07

早期我们的应用程序A使用C++,在使用C++中的crypto API函数将消息发送到应用程序B之前,对消息进行了签名,与中描述的示例完全相似http://msdn.microsoft.com/en-us/library/windows/desktop/aa382372%28v=vs.85%29.aspx.

Application-B使用C++中的Crypto API函数再次验证了此消息(上面的示例再次讨论了如何验证已签名的消息)。

现在,我们正在将旧的C++应用程序A转换/迁移到C#。我已经找到了一种在C#中使用P-Invoke对消息进行签名的方法,并且当Application-B(使用C++CryptVerifySignatureMessage)验证签名的消息时,一切都很正常。示例位于-http://blogs.msdn.com/b/alejacma/archive/2008/02/21/how-to-sign-a-message-and-verify-a-message-signature-c.aspx。

正如@CodeInChaos在他的评论中提到的那样,我希望将互操作工作留给框架(不使用p-Invoke或其他第三方实现,如BountyCastle)

所以我想知道.net是否提供任何API来签署消息(作为一个学习的角度),如果是这样,我该如何实现它

注意:

我已经尝试过由Net.提供的加密包装器APIRSACryptoServiceProvider

    private byte[] SignData(byte[] data, string certThumbPrint)
    {
        X509Certificate2 cert = GetCertificate(); // finds the certificate with thumbprint
        RSACryptoServiceProvider rsaCryptoServiceProvider = (RSACryptoServiceProvider)cert.PrivateKey;
        return rsaCryptoServiceProvider.SignData(data, new SHA1CryptoServiceProvider());
    }

但是发现与C++中的CryptSignMessage和C#中的RSACryptoServiceProvider.SignData()方法的返回值(字节数组)有很大区别。

•CryptSignMessage:CryptSignMessage函数创建指定内容的哈希,对哈希进行签名,然后对原始消息内容和签名的哈希进行编码。

•RSA.SignData:使用指定的哈希算法计算指定字节数组的哈希值,并对生成的哈希值进行签名。

由于这种差异,Application-B在验证消息时会抛出一个错误,称为"无效签名"。

所以我不能使用.net提供的RSACryptoServiceProvider类型。有没有其他方法可以使用任何.NET API实现相同的功能?(当使用.net API时,输出字节数组应该与上面提到的使用PInvoke示例时的输出字节数组类似),以便Application-B可以在没有任何问题的情况下工作。

感谢您的帮助。

加密API函数等价于C#

经过长时间的研究,我找到了一种方法。如果其他人正在寻找如何使用C#中的证书使用PKCS7格式对消息进行签名,那么它就是

    public byte[] SignMsg(
        Byte[] msg,
        X509Certificate2 signerCert)
    {
        //  Place message in a ContentInfo object.
        //  This is required to build a SignedCms object.
        ContentInfo contentInfo = new ContentInfo(msg);
        //  Instantiate SignedCms object with the ContentInfo above.
        //  Has default SubjectIdentifierType IssuerAndSerialNumber.
        //  Has default Detached property value false, so message is
        //  included in the encoded SignedCms.
        SignedCms signedCms = new SignedCms(contentInfo);
        //  Formulate a CmsSigner object, which has all the needed
        //  characteristics of the signer.
        CmsSigner cmsSigner = new CmsSigner(signerCert);
        //  Sign the PKCS #7 message.
        Console.Write("Computing signature with signer subject " +
            "name {0} ... ", signerCert.SubjectName.Name);
        signedCms.ComputeSignature(cmsSigner);
        Console.WriteLine("Done.");
        //  Encode the PKCS #7 message.
        return signedCms.Encode();
    }

从链接中找到信息http://msdn.microsoft.com/en-us/library/ms180961%28v=vs.85%29.aspx。