输入数据不是一个完整的块

本文关键字:一个 数据 输入 | 更新日期: 2023-09-27 18:06:36

我正试图为标记为安全的PDF做批量PDF解锁。我可以不用密码打开这些文件,但我不能修改它。我的测试PDF可以使用在线工具解锁,所以我想如果用c#编程是可能的。下面是我的示例代码

static void Main(string[] args)
{
    string inputfile = @"V:'rwong'Work Files'Secured PDF'Test_15.PDF";
    string outputfile = @"V:'rwong'Work Files'Secured PDF'Test_15_Unsecured.PDF";
    Decrypt(inputfile, outputfile);
}
private static void Decrypt(string inputFilePath, string outputfilePath)
{
    string EncryptionKey = "MAKV2SPBNI99212";
    using (Aes encryptor = Aes.Create())
    {
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
        encryptor.Key = pdb.GetBytes(32);
        encryptor.IV = pdb.GetBytes(16);
        using (FileStream fsInput = new FileStream(inputFilePath, FileMode.Open))
        {
            using (CryptoStream cs = new CryptoStream(fsInput, encryptor.CreateDecryptor(), CryptoStreamMode.Read))
            {
                using (FileStream fsOutput = new FileStream(outputfilePath, FileMode.Create))
                {
                    int data;
                    while ((data = cs.ReadByte()) != -1)
                    {
                        fsOutput.WriteByte((byte)data);
                    }
                }
            }
        }
    }
}
  1. 我一直在while ((data = cs.ReadByte()) != -1)上得到错误但我不知道如何修复它。上面写着input data is not a complete block
  2. 是否有可能做到我想要达到的目标,浪费我的时间,或者我走错了路。

谢谢!

输入数据不是一个完整的块

这绝不是您问题的完全解决方案。但是,假设这种应用加密的方法仍然在使用,包括用于整个文档PDF加密,那么如果您仍然倾向于这样做,那么它可能会让您了解如何需要构建自己的批量解密程序。这是一份日期为2008年的Adobe文档的节选:

算法1:使用RC4或AES算法加密数据

a)从要加密的字符串或流的对象标识符(参见7.3.10"间接对象")中获取对象号和生成号。如果字符串是直接对象,则使用包含它的间接对象的标识符。

b)对于所有没有加密过滤器说明符的字符串和流;将对象号和生成号处理为二进制整数,通过按该顺序附加对象号的低阶3字节和生成号的低阶2字节,将原来的n字节加密密钥扩展为n + 5字节,先添加低阶字节。(n = 5,除非加密字典中V的值大于1,在这种情况下n等于Length的值除以8。)如果使用AES算法,则通过添加值"sAlT"将加密密钥额外扩展4个字节,该值对应于十六进制值0x73, 0x41, 0x6C, 0x54。(此添加是为了向后兼容,而不是为了提供额外的安全性。)

c)初始化MD5哈希函数,并将步骤(b)的结果作为输入传递给该函数。

d)使用MD5哈希输出的第一个(n + 5)字节,最多16个字节作为RC4或AES对称密钥算法的密钥,以及要加密的字符串或流数据。如果使用AES算法,则使用需要初始化向量的Cipher Block chains (CBC)模式。块大小参数设置为16字节,初始化向量是一个16字节的随机数,作为加密流或字符串的前16个字节存储。

输出为要存储在PDF文件中的加密数据