使用.NET框架加密PDF

时间:2013-04-26 05:17:07

标签: c# .net encryption aes

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

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

我尝试使用Adobe 11.0.02,预览版6.0.1,PDFView 0.14.3,Skim 1.4.3和谷歌浏览器。但他们每个都检测到文件已损坏。有人能告诉我什么是错的吗?

我添加了以下代码:

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();
    }
  }
}

1 个答案:

答案 0 :(得分:0)

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

大多数加密数据格式都有某种形式的明文标题或预告片,允许收件人检查有助于解密的标志和元数据。基于一些简短的研究,我发现this page表明PDF加密没有区别。

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

  

PDF文件中的所有流(和字符串)对象都是加密的。这个   足以使文件无用(即,如果不是这样的话)   容易解密)。流/字符串解密的工作方式如下:

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

  2.   
  3. 追加对象编号的3个低位字节(LSB优先)      对于要解密的流/字符串对象。

  4.   
  5. 追加代的2个低位字节(LSB优先)      号。

  6.   
  7. MD5哈希表示10字节字符串。

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

  10.