我实现了一个类来使用.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();
}
}
}
答案 0 :(得分:0)
您的代码意味着您解决此问题的方法是加密整个PDF文件。如果是这样,那么我认为过度简化是导致问题的原因。
大多数加密数据格式都有某种形式的明文标题或预告片,允许收件人检查有助于解密的标志和元数据。基于一些简短的研究,我发现this page表明PDF加密没有区别。
该过程非常具体,而不是对整个文档字节进行全面加密。来自链接文档:
PDF文件中的所有流(和字符串)对象都是加密的。这个 足以使文件无用(即,如果不是这样的话) 容易解密)。流/字符串解密的工作方式如下:
取5字节文件密钥(从上面开始)。
追加对象编号的3个低位字节(LSB优先) 对于要解密的流/字符串对象。
追加代的2个低位字节(LSB优先) 号。
MD5哈希表示10字节字符串。
- 醇>
使用输出的前10个字节作为RC4密钥进行解密 流或字符串。 (这显然仍然符合美国 出口法规,因为它是一个额外的40位密钥 40位“盐”。)