使用itext或itextsharp时,如何确定设置数字证书缓冲区长度的长度?

When using Itext or itextsharp, how do determine the length to set a digital cert buffer length?

我正在使用 itextsharp(但这个问题可能也适用于 itext)并且我正在向 PDF 添加数字签名。我已经阅读过,我知道数字签名的长度会根据 LTV 和其他许多因素而有所不同,因此当您将签名添加到文档时,您通常会分配一个过大的缓冲区来保存证书信息以确保它有足够的 space.

令我困惑的是,我在网上看到了这样设置 sig 压模的示例:

Dictionary<PdfName, int> exc = new Dictionary<PdfName, int>();
exc.Add(PdfName.CONTENTS, BUFFER_SIZE * 2 + 2);
sap.PreClose(exc);

然后稍后清零

byte[] signature_buffer = new byte[BUFFER_SIZE];

int index = 0;
while (index < signature_buffer.Length)
signature_buffer[index++] = 0x20;

PdfDictionary dic2 = new PdfDictionary();
dic2.Put(PdfName.CONTENTS, new PdfString(signature_buffer).SetHexWriting(true));

为什么我们要创建缓冲区长度为 * 2 + 2 的初始字典条目?为什么它与 PdfDictionary 使用的大小不同?是草率的代码被复制了一地,还是有更深层次的原因?

Why do we create the initial dictionary entry with a buffer length * 2 + 2?

这在 iText 中 PdfSignatureAppearance.preClose 的方法注释中有解释(在 iTextSharp 中可能是相同的):

/**
 * This is the first method to be called when using external signatures. The general sequence is:
 * preClose(), getDocumentBytes() and close().
 * <p>
 * If calling preClose() <B>dont't</B> call PdfStamper.close().
 * <p>
 * <CODE>exclusionSizes</CODE> must contain at least
 * the <CODE>PdfName.CONTENTS</CODE> key with the size that it will take in the
 * document. Note that due to the hex string coding this size should be
 * byte_size*2+2.
 * @param exclusionSizes a <CODE>HashMap</CODE> with names and sizes to be excluded in the signature
 * calculation. The key is a <CODE>PdfName</CODE> and the value an
 * <CODE>Integer</CODE>. At least the <CODE>PdfName.CONTENTS</CODE> must be present
 * @throws IOException on error
 * @throws DocumentException on error
 */
public void preClose(HashMap<PdfName, Integer> exclusionSizes) throws IOException, DocumentException

如此处所述,由于十六进制字符串编码,此大小应为 byte_size*2+2 因为 [=24] 的大小=] 签名容器 将收录文档

  • 字节长度的两倍(由于十六进制编码)
  • 加 2(用于括起 PDF 中的十六进制编码字符串的左尖括号和右尖括号)。