具有C#

时间:2018-10-11 08:28:47

标签: c# sha256 sign

在意大利,我们需要对自2019年1月以来的所有发票进行数字签名。

我找到了与sha-1一起使用的代码,但是我需要使用sha256作为标准代码。 下面的代码,在成功检测到USB密钥并要求我使用证书后,请尝试对“ NomeFile”文件进行签名,然后在“ NomeFile” .p7m中输出,当行

signedCms.ComputeSignature(signer,false);

运行,它发生: 1-如果使用sha-1,它将要求我提供PIN码并成功创建文档。 2-如果使用sha-256,请不要输入PIN码,并给我未知错误-1073741275

我读了很多旧文章(2011-2014年)。其他人也有同样的问题,并且似乎Microsoft使用sha256有一些错误。

现在我们到了2018年底,我在.net 4,4.6.1和4.7.2中尝试了此代码,但是错误是相同的。

有人可以告诉我,如果Microsoft用sha256纠正了问题,那么这个奇怪的错误又是什么呢? (-1073741275) Error Stack

public String FirmaFile(String NomeFile, DateTime DataFirma, X509Certificate2 cert, out string RisFirma)
        {
            String NomeFirma = NomeFile + ".p7m";
            RisFirma = "";

            try
            {


                // content contiene il file da firmare
                ContentInfo content = new ContentInfo((File.ReadAllBytes(NomeFile)));
                // assegniamo content ad un oggetto di tipo SignedCms
                SignedCms signedCms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber, content, false);

                // si instanzia un oggetto CmsSigner che espone i metodi di firma.
                CmsSigner signer = new CmsSigner(cert);
                signer.IncludeOption = X509IncludeOption.EndCertOnly;

                //signer.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1");
                signer.DigestAlgorithm = new Oid("SHA256");
                signer.SignedAttributes.Add(new Pkcs9SigningTime(DataFirma));
                try
                {
                    // Viene calcolata la firma del file (in formato PKCS7)
                    signedCms.ComputeSignature(signer,false);
                }
                catch (CryptographicException CEx)
                {
                    RisFirma = "Errore: " + CEx.Message + " Stack: " + CEx.StackTrace;
                    return RisFirma;
                }
                // si pone il file firmato in un array.
                byte[] signature = signedCms.Encode();
                File.WriteAllBytes(NomeFirma, signature);
                RisFirma = "true";
            }
            catch (Exception Ex)
            {
                RisFirma = "Errore in FirmaFile: " + Ex.Message + " Stack: " + Ex.StackTrace;
            }
            return RisFirma;
        }

NB:我尝试了2个版本的OID signer.DigestAlgorithm =新的Oid(“ 2.16.840.1.101.3.4.2.1”); signer.DigestAlgorithm =新的Oid(“ SHA256”);

所有2个都给出相同的错误。

我使用了USB驱动器中包含的具有驱动程序bit4id(https://www.bit4id.com/it/4identity/)的INFOCERT USB密钥。

4 个答案:

答案 0 :(得分:0)

使用此:

is_colorful_number?

答案 1 :(得分:0)

我在Internet上找到了它,我尝试了一下,结果非常成功! 无论如何,解决方案都比较复杂。

您必须使用BouncyCastle(https://www.bouncycastle.org/)库。 但是没有可用的版本,而是由用户在另一个论坛上修改的版本。

修改后的充气城堡库的链接是: http://www.mediafire.com/download/uc63d1hepqyuhee/bccrypto-net-1.7-src-ext_with_CADES-BES.zip

您必须使用bin \ release中找到的crypto.dll库,并在您的项目中引用它。

这些人现在都在用我的东西,在这种情况下可能不需要全部:

set.seed;df<-data.frame(A=runif(1:10),B=sample(0:50,10),C=rnorm(1:10,5));
A<-lapply(df, shapiro.test);B<-data.frame(unlist(A)) 

这是功能:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
using System.IO;
using System.Collections;
using CryptoUpgNet.NonExportablePK;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.Ess;
using Org.BouncyCastle.Cms;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;

编辑:重复使用具有相同证书的证书,仅在第一次询问PIN。因此,在激活安全标准的情况下一次使多个文件变好。

答案 2 :(得分:0)

致Grzegorz:

源文件为5k 正确的签名文件(IT01234567890_FPA01_2.xml.p7m为8k 用例行程序保存的文件中添加

File.WriteAllBytes("c:\\temp\\IT01234567890_FPA01.xml.p7m", wynBin);

之后

byte[] wynBin = csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA256"));

仅1kb,Dike无法识别。 Sign not reckognized

Difference between files

答案 3 :(得分:0)

该错误和症状似乎表明正在执行签名操作的CSP(加密服务提供程序)不支持SHA-2。如果在BouncyCastle中工作,那么他们似乎正在导出私钥,然后将其重新导入到其软件提供程序中。

在.NET 4.7.2中,您可以尝试以下操作:

...
try
{
    // Viene calcolata la firma del file (in formato PKCS7)
    signedCms.ComputeSignature(signer,false);
}
catch (CryptographicException CEx)
{
    try
    {
        // Try re-importing the private key into a better CSP:
        using (RSA tmpRsa = RSA.Create())
        {
            tmpRsa.ImportParameters(cert.GetRSAPrivateKey().ExportParameters(true));

            using (X509Certificate2 tmpCertNoKey = new X509Certificate2(cert.RawData))
            using (X509Certificate2 tmpCert = tmpCertNoKey.CopyWithPrivateKey(tmpRsa))
            {
                signer.Certificate = tmpCert;
                signedCms.ComputeSignature(signer,false);
            }
        }
    }
    catch (CryptographicException)
    {
        // This is the original exception, not the inner one.
        RisFirma = "Errore: " + CEx.Message + " Stack: " + CEx.StackTrace;
        return RisFirma;
    }
}

如果实际上是从USB设备上的PFX文件加载证书,则问题在于PFX指定使用SHA-2之前的较旧软件CSP。重新生成PFX以使用最新的RSA CSP也可以解决该问题。