1

我实现了一个使用 .NET 框架加密 PDF 的类,如此处示例中所述。它使用AESManaged算法来进行加密。

该方法效果很好,我能够加密文档。但我的问题是我无法使用任何 PDF 查看器打开该文件。据我所知,使用任何兼容 AES 的 PDF 查看器,我们应该能够在提供用于加密文档的密钥后打开 PDF。

我尝试使用 Adob​​e 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();
    }
  }
}
4

1 回答 1

0

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

大多数加密数据格式都有某种形式的明文标头或尾标,允许收件人检查有助于解密的标志和元数据。基于简短的研究,我发现此页面表明 PDF 加密也不例外。

该过程不是对整个文档字节进行全面加密,而是非常具体。从链接的文档:

PDF 文件中的所有流(和字符串)对象均已加密。这足以使文件变得无用(也就是说,如果它不是那么容易解密的话)。流/字符串解密的工作方式如下:

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

  2. 为正在解密的流/字符串对象附加对象编号的 3 个低位字节(LSB 在前)。

  3. 附加世代号的 2 个低位字节(LSB 在前)。

  4. MD5 散列该 10 字节字符串。

  5. 使用输出的前 10 个字节作为 RC4 密钥来解密流或字符串。(这显然仍然符合美国出口法规,因为它是一个 40 位密钥和一个额外的 40 位“盐”。)

于 2013-04-26T07:08:07.843 回答