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

时间:2015-08-05 16:59:08

标签: c# pdf cryptography

我正在尝试为标记为安全的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. 是否有可能做我想要实现的目标,浪费我的时间,或者我用错误的方式。
  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

这绝不是您问题的完整解决方案。但是,假设这种应用加密的方法仍在使用,包括整个文档PDF加密,它可能会让您深入了解如果您仍然倾向于如何构建自己的批量解密程序。这是2008年Adobe文档的摘录:

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

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

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

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

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

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