加密和解密Office 2007文档

时间:2011-10-11 06:23:18

标签: encryption office-2007

我正在尝试加密和解密2007 Office文档。我正在使用System.Security.Cryptographic命名空间

我正在使用以下代码

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文件,但它会破坏.xlsx,pptx和docx文件。当我尝试打开文件时,它会提示修复窗口,说文件已被破坏..有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,但是当我使用1号缓冲区(无用)时问题就消失了,我相信还有一堆额外的字节,Office套件软件可以检测到这样的篡改= \