使用.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();
}
}
}
您的代码暗示您解决这个问题的方法是加密整个PDF文件。如果是这样的话,那么我认为过度简化是你的问题的原因。
大多数加密数据格式都有某种形式的明文头或尾,允许接收方检查有助于解密的标志和元数据。根据一些简短的研究,我发现这个页面表明PDF加密没有什么不同。
这个过程是非常具体的,而不是对整个文档字节进行一揽子加密。从链接的文档:PDF文件中的所有流(和字符串)对象都是加密的。这是否足以使文件无用(也就是说,如果不是这样的话)很容易解密)。流/字符串解密的工作原理如下:
取5字节的文件密钥(从上面)
附加对象号的3个低序字节(LSB优先)
追加生成的2个低阶字节(LSB优先)号码。
MD5哈希值:
使用输出的前10个字节作为RC4密钥进行解密流或字符串。(这显然仍然符合美国的要求出口规则,因为这是一个40位的密钥外加一个40位"盐"。)