2011-10-11 47 views
0

我正在嘗試加密和解密2007 Office文檔。我使用System.Security.Cryptographic命名空間加密和解密Office 2007文檔

我使用下面的代碼

using System; 
using System.IO; 
using System.Security; 
using System.Security.Cryptography; 
using System.Runtime.InteropServices; 
using System.Text; 

namespace CSEncryptDecrypt 
{ 
class Class1 
{ 
    static void Main() 
    { 
     // Must be 64 bits, 8 bytes. 
     // Distribute this key to the user who will decrypt this file. 
     string sSecretKey; 

     // Get the Key for the file to Encrypt. 
     sSecretKey = GenerateKey(); 

     // Encrypt the file.   
     EncryptionHelper.EncryptFile(@"XCD - FTW Proposal.docx", 
      @"Encrypted.txt", 
      sSecretKey); 

     // Decrypt the file. 
     EncryptionHelper.DecryptFile(@"Encrypted.txt", 
      @"OUTPUT\XCD - FTW Proposal.docx", 
      sSecretKey); 
    } 

    // Function to Generate a 64 bits Key. 
    static string GenerateKey() 
    { 
     // Create an instance of Symetric Algorithm. Key and IV is generated automatically. 
     DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create(); 

     // Use the Automatically generated key for Encryption. 
     return ASCIIEncoding.ASCII.GetString(desCrypto.Key); 
    } 
    } 
    public class EncryptionHelper 
    { 
       public static void EncryptFile(string sInputFilename, string sOutputFilename, string sKey) 
     { 

      //GCHandle gch = GCHandle.Alloc(sKey, GCHandleType.Pinned); 
      FileStream fsInput = new FileStream(sInputFilename, 
      FileMode.Open, 
      FileAccess.Read); 

     FileStream fsEncrypted = new FileStream(sOutputFilename, 
      FileMode.Create, 
      FileAccess.Write); 
     DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
     DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
     DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 
     DES.Padding = PaddingMode.PKCS7; 

     //DES.Padding = PaddingMode.ANSIX923; 
     ICryptoTransform desencrypt = DES.CreateEncryptor(); 
     CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
      desencrypt, 
      CryptoStreamMode.Write); 

     byte[] bytearrayinput = new byte[fsInput.Length]; 
     fsInput.Read(bytearrayinput, 0, bytearrayinput.Length); 
     cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length); 
     cryptostream.Flush(); 
     cryptostream.Close(); 
     fsInput.Flush(); 
     fsInput.Close(); 
     fsEncrypted.Close(); 

    } 

    public static void DecryptFile(string sInputFilename, string sOutputFilename, string sKey) 
    { 

     DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
     //A 64 bit key and IV is required for this provider. 
     //Set secret key For DES algorithm. 
     DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
     //Set initialization vector. 
     DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 

     //Create a file stream to read the encrypted file back. 
     FileStream fsread = new FileStream(sInputFilename, 
      FileMode.Open, 
      FileAccess.Read); 
     FileStream fsEncrypted = new FileStream(sOutputFilename, 
     FileMode.Create, 
     FileAccess.Write); 
     //Create a DES decryptor from the DES instance. 
     ICryptoTransform desdecrypt = DES.CreateDecryptor(); 
     //Create crypto stream set to read and do a 
     //DES decryption transform on incoming bytes. 
     CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
      desdecrypt, 
      CryptoStreamMode.Read); 
     byte[] fileData = new byte[fsread.Length]; 
     cryptostreamDecr.Read(fileData, 0, (int)fsread.Length); 
     fsEncrypted.Write(fileData, 0, fileData.Length); 
     fsread.Flush(); 
     fsread.Close(); 
     fsEncrypted.Flush(); 
     fsEncrypted.Close(); 
     cryptostreamDecr.Flush(); 
     cryptostreamDecr.Close(); 
    } 
} 
} 

上面的代碼工作正常,DOC,XLS,PPT,TXT文件,但它currupts的.xlsx,PPTX和docx文件。當我嘗試打開該文件時,它會提示修復窗口說該文件已被破壞。任何想法?

+1

XLSX ,pptx和docx基本上都是zip文件。你的代碼是否也破壞了.zip檔案? –

回答

0

但我面臨着同樣的問題,當我使用的大小的緩衝區1(沒用)問題就消失了,我相信有一堆添加額外的字節和Office套裝軟件可以檢測到這種篡改= \