如何使用iTextSharp和c使用哈希字符串生成签名#

如何使用iTextSharp和c使用哈希字符串生成签名#,itext,signature,Itext,Signature,我试图在MakeSignature.SignExternalContainer中添加公钥字符串,但出现错误 字符串sing_测试="MiifmtccbbmgawiBagicMf8WdqyjkozihvcnaqwfDelmakGa1EbHMCSU4xKjObgnvBaotiu5TrewgZS1Hb3YgSW5McMfzHj1Y3CmUg1CmUzBd1Cd1Cd1CmUg2VyDbDxRob3JdHdDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxD

我试图在MakeSignature.SignExternalContainer中添加公钥字符串,但出现错误

字符串sing_测试="MiifmtccbbmgawiBagicMf8WdqyjkozihvcnaqwfDelmakGa1EbHMCSU4xKjObgnvBaotiu5TrewgZS1Hb3YgSW5McMfzHj1Y3CmUg1CmUzBd1Cd1Cd1CmUg2VyDbDxRob3JdHdDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDxDDBMOGE2YMVLZZJZIDGYZYZYZYXNJA0BGNVBC0DLQBSBnLoovVunze5NKNPAQVnTugZYYTv0CS3ZIDAMWZQKbBmUZZr9PWSNAR7WTB2MA74SZ4U2XZZYFNSH22YPD+YSBGQJTUD9XBhQQQQQQdaQabo4IbQb4IbKv0ObWNGCd7Bg7Bg7BgWbGb7BgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWg8WgWgWgWgWgWgWgWg2L9WgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgUFBWICMFAATKFHZGHYXIGHZS1LWumtQMLv0cmljiensyxNzienLCNRPzMLJYXRILZC3VlzCBIESBOU0RMIGUTR292IELZC3VPBMCGQ0EGVGZDDAHBGNhreegjayGrztyW5P2HIZW5KCMv0cmVaz21WuY29TMBMGA1diWqmaqacebu2QI4QIgW4W0W9W0BaqfaoCaqeadQadbugW9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9W9V9V9FlDHHMKflMkG/ja3b6FWK1W/1L0/YJYPJL4E2UUU5TQ0T3K4ZOPAT95ZD8JRQWZ6SYYX1VXQLTRUB8EIAUVAJ92PRVOVxUSVUPZOLB3AOCKWER6JQGXOIWSSENQUUCUD3VWU5TZWW9OCPIDAKBUYWWTNTORFKMZVWD42JKHRF9J1SNBR4DYKOSKOSQR6CDZFUKW2GKWFCA=”

正在获取错误。。 签名验证期间出错。 BER解码时遇到错误:


谢谢…

如果我正确理解了您的代码(您在解释方面有些沉默寡言),首先调用返回哈希值的
GetBytesToSign
,然后对哈希进行签名,并使用
EmbedSignature
将其嵌入。调用这些方法时使用哪些参数?如果使用第一个方法的pdf输出作为第二个方法的输入(我假设是因为这些方法的参数名称),然后您添加两个不同的签名字段,第一个字段中没有嵌入签名,第二个字段中嵌入了为第一个字段生成的签名……或者您是否使用原始PDF文件作为两个方法的输入,并丢弃第一个方法调用的输出PDF?在这种情况下,您将re是为您丢弃的不同范围生成的哈希的签名值。或者您是否仍在以其他方式使用您的代码?您试图用该证书做什么?顺便说一句,base 64编码字符串似乎以某种方式被破坏。谢谢,我想使用公钥在PDF上生成数字签名。请澄清您的问题;在我的ree初始评论我要求澄清一些方面。有人说……“我想使用公钥在PDF上进行数字签名。”-您知道您也需要私钥进行签名吗?(对于p12,显式是,对于HSM或签名服务,隐式是。)
byte[] rawData = System.Convert.FromBase64String(sing_test );

    public static byte[] GetBytesToSign(string unsignedPdf, string tempPdf, string signatureFieldName)
    {
        using (PdfReader reader = new PdfReader(unsignedPdf))
        {
            using (FileStream os = File.OpenWrite(tempPdf))
            {
                PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0');
                PdfSignatureAppearance appearance = stamper.SignatureAppearance;
                appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(36, 748, 144, 780), 1, signatureFieldName);
                IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
                MakeSignature.SignExternalContainer(appearance, external, 8192);
                stamper.Close();
                return SHA1Managed.Create().ComputeHash(appearance.GetRangeStream());
            }
        }
    }

public static void EmbedSignature(string tempPdf, string signedPdf, string signatureFieldName, byte[] signedBytes)
{
    using (PdfReader reader = new PdfReader(tempPdf))
    {
        using (FileStream os = File.OpenWrite(signedPdf))
        {
            PdfStamper st = PdfStamper.CreateSignature(reader, os, '\0', null, true);               
            PdfSignatureAppearance sap = st.SignatureAppearance;
            sap.Reason = "Testing";
            sap.Location = "Test";
            sap.SetVisibleSignature(new iTextSharp.text.Rectangle(250, 50, 50, 100), 1, null);
            IExternalSignatureContainer external = new MyExternalSignatureContainer(signedBytes);
            try
            {
               MakeSignature.SignExternalContainer(sap, external, 8192);
            }
            catch (Exception ex) {  }
            st.Close();
        }
    }
}

private class MyExternalSignatureContainer : IExternalSignatureContainer
{
    private readonly byte[] signedBytes;

    public MyExternalSignatureContainer(byte[] signedBytes)
    {
        this.signedBytes = signedBytes;
    }

    public byte[] Sign(Stream data)
    {
        return signedBytes;
    }

    public void ModifySigningDictionary(PdfDictionary signDic)
    {
    }
}