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

时间:2015-07-15 19:08:40

标签: c# certificate itext digital-signature

我正在使用itextsharp(但这个问题可能也适用于itext),我正在为PDF添加数字签名。我已经完成了阅读,并且我理解数字签名的长度会因LTV和其他因素的漏洞而异,所以当您将签名添加到文档时,通常会分配一个过大的缓冲区来保存证书信息确保它有足够的空间。

让我感到困惑的是,我在整个网络上看到一个例子,其中设置了一个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使用的大小不同?是不是在整个地方复制了草率代码的情况,还是有更深层次的原因?

1 个答案:

答案 0 :(得分:2)

  

为什么我们创建一个缓冲区长度为* 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 ,因为 签名容器将占用的大小文件

  • 字节长度的两倍(由于十六进制编码)
  • 加2(用于打开和关闭带角度的括号,用PDF括起十六进制编码的字符串)。