当前位置: 首页 > 编程语言 > C#

WinRT中是否有SignedCMS的替代方案?

时间:2023-04-10 22:55:24 C#

WinRT中是否有SignedCMS的替代方案?将.NET桌面应用程序移植到Windows应用程序商店应用程序时,我再次陷入困境……简而言之,我有一个ZIP文件,其中包含一个加密和签名的XML文件以及一个证书。解密工作(或多或少),但现在我必须“取消签名”XML,我被卡住了。在.NET应用程序中,取消签名是使用System.Security.Cryptography.Pkcs.SignedCms完成的,但该类在WinRt中不存在(一如既往......)WinRT的任何替代方案?这是.NET应用程序中使用的一些代码:publicstaticbyte[]CheckAndRemoveSignature(byte[]data,X509Certificate2CollectioncertStore,outSignedCmsout_signature){signedMessage.解码(数据);如果((certStore!=null)&&(certStore.Count>0))signedMessage.CheckSignature(certStore,true);否则signedMessage.CheckSignature(true);out_signature=signedMessage;//返回没有签名的数据returnsignedMessage.ContentInfo.Content;搜索了很多,但我发现唯一可以帮助我的是这篇文章。不幸的是,标记的答案没有提供任何有用的信息:(Windows8MetroEncryption-使用SignedCmsPkcs7我真的很感激这里的一些帮助:)编辑基本问题是从签名字节数组中获取原始xml数据。或者,更具体地说,我需要函数SignedCmssignedMessage=newSignedCms();signedMessage.解码(数据);byte[]result=signedMessage.ContentInfo.Content;在WinRT中使用这几行代码;我尝试了pepo的示例,但我得到了MalformedContent异常privatebyte[]CheckAndRemoveSignature(byte[]data){//varallSigsValid=VerifySignatures(sig);byte[]content=sig.SignedContent.GetContent()asbyte[];返回内容;}catch(Exceptionex){cryptOutput.Text+="ErrorremoveingSignature:"+ex;返回数据;我得到这个异常:Org.BouncyCastle.Cms.CmsException:Malformedcontent.--->System.ArgumentException:工厂中的未知对象:Org.BouncyCastle.Asn1.Cms.ContentInfo.GetInstance(Objectobj)atOrg.BouncyCastle.Cms.CmsUtilities.ReadAsntent1Info(StringaIn)中的DerApplicationSpecific---内部结束异常堆栈跟踪---在Org.BouncyCastle.Cms.CmsUtilities.ReadContentInfo(Asn1InputStreamaIn)atOrg.BouncyCastle.Cms.CmsUtilities.ReadContentInfo(Streaminput)atOrg.BouncyCastle.Cms.CmsSignedData..ctor(Byte[]sigBlock)atTestApp.MainPage.CheckAndRemoveSignature(Byte[]data)来自表格应用程序的代码,其中XML文件已签名:privatebyte[]signInternal(byte[]data,X509Certificate2signatureCert,boolsignatureOnly){CAPICOM.SignedDatasignedData=newCAPICOM.SignedDataClass();CAPICOM.Utilitiesu=newCAPICOM.UtilitiesClass();signedData.set_Content(u.ByteArrayToBinaryString(数据));GC.收集();CAPICOM.Signer签名者=newCAPICOM.Signer();signer.Options=CAPICOM.CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY;CAPICOM.CertificateClasscertClass=newCAPICOM.CertificateClass();certClass.Import(Convert.ToBase64String(signatureCert.Export(X509ContentType.SerializedCert)));signer.Certificate=certClass;GC.收集();如果(this.validateCert(signatureCert))返回(byte[])Convert.FromBase64String(signedData.Sign(signer,signaatureOnly,CAPICOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64));否则返回新字节[]{};}解决方案最后发现编码有很大问题,我觉得不值得关注pepo的答案有效,但我会发布我的版本以展示如果您从zip文件夹中获取文件它是如何工作的://getbytesfromzipbyte[]data=getFileContentAsByteArray(zipBytes,ze.FileName);vardataString=Encoding.UTF8.GetString(data,0,data.Length);//检查并删除签名boolisValid;byte[]withoutSig=CheckAndRemoveSignature(dataString,outisValid);privatebyte[]CheckAndRemoveSignature(stringdata,outboolisValid){isValid=false;//使用bouncyCastletry{varbytes=Convert.FromBase64String(data);//将数据分配给CmsSignedDataCmsSignedDatasig=newCmsSignedData(bytes);//检查签名是否有效varallSigsValid=VerifySignaturesBC(sig);如果(allSigsValid.Equals(true)){isValid=true;}//从cms获取签名byte[]content=sig.SignedContent.GetContent()asbyte[];返回内容;}catch(Exceptionex){cryptOutput.Text+=“'BouncyCastleunsign'错误”+ex;返回空值;根据评论,我了解到您有一个PKCS#7结构(SignedCms),并且该结构的内容是一个XmlDocument。由于WinRTAPI中没有SignedCms,因此有两个选项。使用一些ASN.1库并手动解析PKCS#7查找或使用已经实现SignedCms并可以解析该结构的BouncyCastle。您要求使用bouncyCastle的示例。这里是。使用Org.BouncyCastle.Cms;使用Org.BouncyCastle.X509.Store;使用系统集合;使用System.Security.Cryptography.Pkcs;namespaceConsoleApplication2{classProgram{staticvoidMain(string[]args){//使一些pkcs7signedCms在SignedCms上工作p7=newSignedCms(newSystem.Security.Cryptography.Pkcs.ContentInfo(newbyte[]{0x01,0x02}));p7.ComputeSignature(newCmsSigner(),false);//编码得到signedCmsbyte[]表示varsignedCms=p7.Encode();//使用bouncyCastleCmsSignedData加载sig=newCmsSignedData(signedCms);varallSigsValid=VerifySignatures(sig);byte[]content=sig.SignedContent.GetContent()asbyte[];}//取自充气城堡SignedDataTest.csprivatestaticboolVerifySignatures(CmsSignedDatasp){varsignaturesValid=true;IX509Storex509Certs=sp.GetCertificates("集合");SignerInformationStoresigners=sp.GetSignerInfos();foreach(signers.GetSign中的SignerInformation签名者ers()){ICollectioncertCollection=x509Certs.GetMatches(signer.SignerID);IEnumeratorcertEnum=certCollection.GetEnumerator();certEnum.MoveNext();Org.BouncyCastle.X509.X509Certificatecert=(Org.BouncyCastle.X509.X509Certificate)certEnum.Current;signaturesValid&=signer.Verify(cert);}返回签名有效;至于ASN.1库,我只使用了bouncyCastle,它有ASN.1解析器或ASN.1编辑器,这是一个非常有用的GUI应用程序,用于显示PKCS#7的结构、证书等。所以我只推荐这两个。您可能正在寻找类似Windows.Security.Cryptography.Certificates.CmsAttachedSignature.VerifySignature()之类的东西,它的'content'属性在这里如果所有共享内容对您有用并且您需要了解更多C#学习教程,我希望你会更加关注它。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: