如果128位rc4, Itextsharp无法打开带有密码的文件

本文关键字:密码 文件 rc4 128位 Itextsharp 如果 | 更新日期: 2023-09-27 18:10:17

我有密码保护的pdf文件,我试图打开以禁用密码保护。我已经能够用128位aes的样本来做,但我在生产中处理的大多数文件都是128位rc4。每当我在128位rc4上尝试以下代码时,它都会失败并给我错误:

try
{
    PdfReader reader = new PdfReader(InputFile, new System.Text.ASCIIEncoding().GetBytes(password));
    using (MemoryStream memoryStream = new MemoryStream())
    {
         PdfStamper stamper = new PdfStamper(reader, memoryStream);
         stamper.Close();
         reader.Close();
         File.WriteAllBytes(OutputFile, memoryStream.ToArray());
    }
}
catch (Exception ex)
{
    Console.WriteLine(InputFile + " ::::: " + password + " ---> " + ex.Message);
}

示例pdf: https://drive.google.com/file/d/0BxDisLjTqrx8QnFQQ013SFhmdGM/edit?usp=sharing传递文件是:123456 显然这只是为了测试的目的;)

如果128位rc4, Itextsharp无法打开带有密码的文件

(评论的回答)

这似乎是产生有问题的pdf的mPDF库的问题。根据规范,第3.5.2节:

PDF整数对象在内部以双补号形式表示。由于加密字典的P值中所有保留的高阶标志位都必须为1,因此必须将该值指定为负数。

有问题的PDF的/P值为4294967292,根据规范是不正确的。如果我没算错的话,应该是-4。手动更改iTextSharp以在PdfEncrption.cs中使用SetupByUserPassword-4权限可以使解密成功。

iTextSharp使用Int32来保持2,147,483,647的最大权限。当。net从4294967292字符串转换时,它开始作为Float,然后。net尝试将其转换为Int32,但根据c#规范,它失败并返回"目标类型的未指定值"。

当从双精度值或浮点值转换为整型时值被截断。如果得到的整数值在目标值的范围,结果取决于溢出检查上下文。在已检查的上下文中,OverflowException是在未检查的上下文中抛出,结果是未指定的目的类型的值。

Adobe和其他库可能使用更宽的类型,如64位整数,这就是为什么他们能够打开PDF。

OP的解决方案是将iTextSharp的部分源代码从Int32更改为Int64。这对于他们非常特殊的情况是可以的,但我不建议大多数人这样做,除非他们很好地掌握了所使用的加密算法。理想情况下,这应该是固定的mPDF和可能的iText可以添加支持来处理这个无效的值。