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

C# 输入数据不是一个完整的块?,c#,pdf,cryptography,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

我正在尝试为标记为安全的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);
                    }
                }
            }
        }
    }
}
  • 当((data=cs.ReadByte())!=-1) 但我不知道如何修复它。它表示
    输入数据不是一个完整的块
  • 是否有可能去做我想做的事情,浪费我的时间,或者我走错了这条路

  • 谢谢

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

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

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

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

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

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


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

    该文件实际上只是一个使用该密钥完全加密的文件吗?这似乎不太可能。我怀疑PDF有一个“加密文件容器”的方面-这不仅仅是将其作为数据流解密的问题。根据您的评论,听起来好像每个文件都需要不同的密钥。我不能强制执行它?我希望每个文件都有不同的密钥-但更重要的是,你假设它只是一个完全加密的文件,而我希望加密是PDF容器的一部分。。。基本上,这不是我希望你解密加密PDF文件的方式。我明白了,谢谢你的澄清。我猜解锁通用PDF需要比我上面写的代码多得多。如果你做研究,你会发现已经有库了。如果每个人在编程之前都不做任何研究,那么PDF创建者可能一开始就懒得做任何加密。只是随便尝试一下会花很长时间。