C# 使用.NET framework加密PDF

C# 使用.NET framework加密PDF,c#,.net,encryption,aes,C#,.net,Encryption,Aes,我使用.NET framework实现了一个类来加密PDF,如示例中所述。它使用了AES管理的算法进行加密 这种方法非常有效,我能够对文档进行加密。但我的问题是,我无法使用任何PDF查看器打开该文件。据我所知,使用任何符合AES标准的PDF查看器,我们应该能够在提供用于加密文档的密钥后打开PDF 我试过使用Adobe 11.0.02、Preview 6.0.1、PDFView 0.14.3、Skim 1.4.3和Google Chrome。但它们都检测到文件已损坏。有人能告诉我怎么了吗 我添加了

我使用.NET framework实现了一个类来加密PDF,如示例中所述。它使用了
AES管理的
算法进行加密

这种方法非常有效,我能够对文档进行加密。但我的问题是,我无法使用任何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();
    }
  }
}

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

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

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

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

  • 获取5字节的文件密钥(从上面)

  • 追加对象编号的3个低阶字节(LSB优先) 用于正在解密的流/字符串对象

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

  • MD5散列该10字节字符串

  • 使用输出的前10个字节作为RC4密钥进行解密 溪流或细绳。(这显然仍然符合美国的要求 导出规则,因为它是一个带有附加 40位“盐”。)


  • 我不这么认为。我的做法与示例中提到的完全相同。请参阅更新的问题(另一个问题是所有查看器中都存在bug,这是非常可疑的。另外,这可能不是加密问题,而是数据的其他处理问题。例如,是否存在未加密的头或加密PDF使用的帧?)实际上代码中可能存在bug。但我在这个例子中也是这样做的@user2246674我实际上不知道.NET framework实现ESMANAGED算法的方式。@ganuke AES是AES。只要使用了正确的参数(例如IV、mode),那么它将与任何其他有效的AES实现一样工作。当然,另一点是确保使用相同的(填充的)关键策略。(我有一种感觉,发布的答案包含了原始加密不起作用的基础;如果加密错误,我会想象PDF以一种非常无用的方式显示,或者显示一个更具体的加密错误。)