2013-04-26 47 views
1

我實現了一個類來使用.NET框架加密PDF,如示例here中所述。它使用AESManaged算法來進行加密。使用.NET框架加密PDF

該方法工作完美,我能夠加密文件。但我的問題是我無法使用任何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(); 
    } 
    } 
} 
+1

錯誤在你的代碼? – 2013-04-26 05:18:23

+0

我不這麼認爲。我採用了與例子中提到的完全相同的方式。查看更新後的問題 – nath 2013-04-26 05:28:39

+1

(另一種方法是在所有查看器中出現錯誤,這是非常可疑的問題,也可能不是加密問題,而是數據的其他處理,例如,是否存在未加密的頭文件或成幀與加密的PDF一起使用?) – user2246674 2013-04-26 06:22:15

回答

0

你的代碼,意味着你的方法這個問題已經加密整個PDF文件。如果是這樣,那麼我認爲過度簡化是你的問題的原因。

大多數加密的數據格式具有某種形式的明文頭或尾部,允許收件人檢查有助於解密的標誌和元數據。基於一小段研究,我發現this page這表明PDF加密沒有什麼不同。

而不是整個文檔字節的一攬子加密,這個過程是非常具體的。從鏈接的文檔:

PDF文件中的所有流(和字符串)對象都被加密。這個 足以使文件無用(也就是說,如果它不是那麼容易解密的話)。數據流/字符串解密的工作原理如下:

  1. 取5個字節的文件密鑰(從上方)。

  2. 爲要解密的流/字符串對象附加對象編號爲 的3個低位字節(LSB優先)。

  3. 追加生成 號碼的2個低位字節(LSB優先)。

  4. MD5散列那10個字節的字符串。

  5. 使用輸出的前10個字節作爲RC4密鑰來解密流或字符串 。 (這顯然仍符合美國 出口法規,因爲它是一個額外 40位「鹽」一個40位的密鑰。)