Шифрование и дешифрование документов Office 2007 - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь зашифровать и расшифровать офисные документы 2007 года.Я использую пространство имен 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 голосов
/ 11 марта 2012

Я столкнулся с той же проблемой, однако, когда я использовал буфер размером 1 (бесполезный), проблема исчезла, я полагаю, что было добавлено множество дополнительных байтов, и программное обеспечение пакета Office может обнаружить такое вмешательство = \

...