如何在C#PCL中解码/解密SignedCMS / PKCS#7

时间:2017-06-21 18:51:10

标签: c# xamarin asp.net-web-api2 portable-class-library pkcs#7

所以,我有一个WebAPI将PKCS#7文件返回给客户端。客户端被编写为C#PCL,因此可以在Xamarin iOS和Android项目中使用。

我的初始测试工作正常,因为我在单元测试中编码和解码,可以使用Pkcs库。似乎我找不到任何解码客户端数据的方法,因为我不知道任何与PCL一起工作的Pkcs库。

有人可以告诉我如何做到这一点?

2 个答案:

答案 0 :(得分:2)

所以,我最终将我的项目切换到.netstandard 1.4并使用Portable.BouncyCastle来解码在服务器端创建的Cms。

这是我用来解码Cms的代码。我有点相信这也是在检查签名,因为在BouncyCastle中没有明确的方法可以通过框架代码,例如CheckSignature()来实现。

var cmsParser = new Org.BouncyCastle.Cms.CmsSignedDataParser(dataBytes);
var cmsSignedContent = cmsParser.GetSignedContent();
var contentStream = cmsSignedContent.ContentStream;
var memoryStream = new MemoryStream();
contentStream.CopyTo(memoryStream);
byte[] contentBytes = memoryStream.ToArray();
var decodedContent = Encoding.UTF8.GetString(contentBytes);

另外我添加了这个以验证签名者信息:

cmsParser.GetSignedContent().Drain();
var certStore = cmsParser.GetCertificates("Collection");
var signerInfos = cmsParser.GetSignerInfos();
var signers = signerInfos.GetSigners();

foreach (SignerInformation signer in signers)
{
    var certCollection = certStore.GetMatches(signer.SignerID);
    foreach (Org.BouncyCastle.X509.X509Certificate cert in certCollection)
    {
        var result = signer.Verify(cert);
        if (!result)
        {
            throw new Exception("Certificate verification error, the signer could not be verified.");
        }
    }
}

我不能100%确定这是否是我需要做的全部,但我的客户将通过SSL进行通信,并且他们正在使用具有appId和客户端密码的HMAC身份验证,因此我可以不那么关心过境问题。我基本上转移了#34;许可证"文件,我想确保内容在客户端设备上保存后不被篡改。

如果有任何人对此有任何建议或疑虑,请告诉我。 感谢。

答案 1 :(得分:0)

我目前使用PCLCrypto在客户端(在Xamarin Forms项目中)使用PKCS#7加密和解密。我认为它也会做你需要的。

可以找到PKCS#7 wiki示例here