Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用PKCS 7和SHA算法在C#中创建数字签名并进行验证_Java_C#_Code Conversion - Fatal编程技术网

Java 如何使用PKCS 7和SHA算法在C#中创建数字签名并进行验证

Java 如何使用PKCS 7和SHA算法在C#中创建数字签名并进行验证,java,c#,code-conversion,Java,C#,Code Conversion,我正在尝试对xml文档进行数字签名,并使用带有公钥和签名文档的原始xml文件验证签名。我有一个java代码供参考。我需要将java代码转换为C#其中的java代码如下: certList = new ArrayList<X509Certificate>(); certList.add(signerCert); certStore = new JcaCertStore(certList); signedDataGenerator = new CMSSignedD

我正在尝试对xml文档进行数字签名,并使用带有公钥和签名文档的原始xml文件验证签名。我有一个java代码供参考。我需要将java代码转换为C#其中的java代码如下:

   certList = new ArrayList<X509Certificate>();
   certList.add(signerCert);
   certStore = new JcaCertStore(certList);
   signedDataGenerator = new CMSSignedDataGenerator();
   ContentSigner sha2Signer = new JcaContentSignerBuilder("SHA512with" + privateKey.getAlgorithm()).build(privateKey);

   ignedDataGenerator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build()).setDirectSignature(true).build(sha2Signer, signerCert));
   signedDataGenerator.addCertificates(certStore);
   CMSSignedData sigData = signedDataGenerator.generate(new CMSProcessableFile(inputXmlFile), false);
   signedBytes = sigData.getEncoded();
        X509Store my = new X509Store(StoreName.My, StoreLocation.LocalMachine);
        my.Open(OpenFlags.ReadOnly);
        // Find the certificate we’ll use to sign
        RSACryptoServiceProvider csp = null;
        foreach (X509Certificate2 cert in my.Certificates)
        {
            if (cert.Subject.Contains(certSubject))
            {
                // We found it.
                // Get its associated CSP and private key
                csp = (RSACryptoServiceProvider)cert.PrivateKey;                  
            }
        }
        if (csp == null)
        {
            throw new Exception("oppose no valid application was found");
        }
        // Hash the data
        SHA512Managed sha1 = new SHA512Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(text);
        byte[] hash = sha1.ComputeHash(data);
        // Sign the hash
        return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));

我试图转换它,因为两天,它正在生成符号字节数组,但无法验证。在验证它是否抛出错误哈希\r\n错误时,我将非常感谢您的帮助。我知道我在将java代码转换为C#时出错了。我能够验证代码,但无法对文档签名

我使用System.Security.Cryptography.Pkcs库生成了签名,如下所示

    public static byte[] Sign(byte[] data, X509Certificate2 certificate)
    {
        if (data == null)
            throw new ArgumentNullException("data");
        if (certificate == null)
            throw new ArgumentNullException("certificate");

        // setup the data to sign
        ContentInfo content = new ContentInfo(data);
        SignedCms signedCms = new SignedCms(content, false);
        CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate);
        // create the signature
        signedCms.ComputeSignature(signer);
        return signedCms.Encode();
    }
然后像这样验证签名

  private static bool VerifySignatures(FileInfo contentFile, Stream signedDataStream)
    {
        CmsProcessable signedContent = null;
        CmsSignedData cmsSignedData = null;
        Org.BouncyCastle.X509.Store.IX509Store store = null;
        ICollection signers = null;
        bool verifiedStatus = false;
        try
        {
            //Org.BouncyCastle.Security.addProvider(new BouncyCastleProvider());
            signedContent = new CmsProcessableFile(contentFile);
            cmsSignedData = new CmsSignedData(signedContent, signedDataStream);
            store = cmsSignedData.GetCertificates("Collection");//.getCertificates();
            IX509Store certStore = cmsSignedData.GetCertificates("Collection");
            signers = cmsSignedData.GetSignerInfos().GetSigners();
            foreach (var item in signers)
            {
                SignerInformation signer = (SignerInformation)item;
                var certCollection = certStore.GetMatches(signer.SignerID);
                IEnumerator iter = certCollection.GetEnumerator();
                iter.MoveNext();
                var cert = (Org.BouncyCastle.X509.X509Certificate)iter.Current;
                verifiedStatus = signer.Verify(cert.GetPublicKey());
            }

        }
        catch (Exception e)
        {
            throw e;
        }

        return verifiedStatus;
    }

它对我有效

我使用System.Security.Cryptography.Pkcs库生成了签名,如下所示

    public static byte[] Sign(byte[] data, X509Certificate2 certificate)
    {
        if (data == null)
            throw new ArgumentNullException("data");
        if (certificate == null)
            throw new ArgumentNullException("certificate");

        // setup the data to sign
        ContentInfo content = new ContentInfo(data);
        SignedCms signedCms = new SignedCms(content, false);
        CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate);
        // create the signature
        signedCms.ComputeSignature(signer);
        return signedCms.Encode();
    }
然后像这样验证签名

  private static bool VerifySignatures(FileInfo contentFile, Stream signedDataStream)
    {
        CmsProcessable signedContent = null;
        CmsSignedData cmsSignedData = null;
        Org.BouncyCastle.X509.Store.IX509Store store = null;
        ICollection signers = null;
        bool verifiedStatus = false;
        try
        {
            //Org.BouncyCastle.Security.addProvider(new BouncyCastleProvider());
            signedContent = new CmsProcessableFile(contentFile);
            cmsSignedData = new CmsSignedData(signedContent, signedDataStream);
            store = cmsSignedData.GetCertificates("Collection");//.getCertificates();
            IX509Store certStore = cmsSignedData.GetCertificates("Collection");
            signers = cmsSignedData.GetSignerInfos().GetSigners();
            foreach (var item in signers)
            {
                SignerInformation signer = (SignerInformation)item;
                var certCollection = certStore.GetMatches(signer.SignerID);
                IEnumerator iter = certCollection.GetEnumerator();
                iter.MoveNext();
                var cert = (Org.BouncyCastle.X509.X509Certificate)iter.Current;
                verifiedStatus = signer.Verify(cert.GetPublicKey());
            }

        }
        catch (Exception e)
        {
            throw e;
        }

        return verifiedStatus;
    }

它对我有用

欢迎来到Stack Overflow!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。错误哈希\r\n是我遇到的错误欢迎使用堆栈溢出!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。错误哈希\r\n是我获取的错误问题signedDataStream到底是什么,从何处获取以及如何获取?ThxQuestion signedDataStream到底是什么?从何处获取?如何获取?谢谢