使用.net框架加密PDF

本文关键字:PDF 加密 框架 net 使用 | 更新日期: 2023-09-27 18:10:53

我实现了一个使用. net框架加密pdf的类,如下面的示例所示。采用AESManaged算法进行加密。

这种方法非常有效,我能够加密文档。但我的问题是我无法使用任何PDF查看器打开该文件。根据我的知识,使用任何符合AES的PDF查看器,我们应该能够在提供用于加密文档的密钥后打开PDF。

我尝试了Adobe 11.0.02, Preview 6.0.1, PDFView 0.14.3, Skim 1.4.3和Google Chrome。但它们都检测到文件已损坏。谁能告诉我怎么了?

我添加了下面的代码:

using (AesManaged aesAlg = new AesManaged())
{
  aesAlg.Key = Key;
  aesAlg.IV = IV;
  // Create a decrytor to perform the stream transform.
  ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
  // Create the streams used for encryption. 
  using (MemoryStream msEncrypt = new MemoryStream())
  {
    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
    {
      using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
      {
        //Write all data to the stream.
        swEncrypt.Write(plainText);
      }
      encrypted = msEncrypt.ToArray();
    }
  }
}

使用.net框架加密PDF

您的代码暗示您解决这个问题的方法是加密整个PDF文件。如果是这样的话,那么我认为过度简化是你的问题的原因。

大多数加密数据格式都有某种形式的明文头或尾,允许接收方检查有助于解密的标志和元数据。根据一些简短的研究,我发现这个页面表明PDF加密没有什么不同。

这个过程是非常具体的,而不是对整个文档字节进行一揽子加密。从链接的文档:

PDF文件中的所有流(和字符串)对象都是加密的。这是否足以使文件无用(也就是说,如果不是这样的话)很容易解密)。流/字符串解密的工作原理如下:

  1. 取5字节的文件密钥(从上面)

  2. 附加对象号的3个低序字节(LSB优先)

  3. 追加生成的2个低阶字节(LSB优先)号码。

  4. MD5哈希值:

  5. 使用输出的前10个字节作为RC4密钥进行解密流或字符串。(这显然仍然符合美国的要求出口规则,因为这是一个40位的密钥外加一个40位"盐"。)