加密和解密 Office 2007 文档

发布于 2024-12-09 04:37:35 字数 4079 浏览 0 评论 0原文

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

我正在使用以下代码

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 文件。当我尝试打开该文件时,它会提示一个修复窗口,说该文件已损坏..有什么想法吗?

I am trying to encrypt and decrypt 2007 office documents. I am using System.Security.Cryptographic namespace

I am using the following code

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();
    }
}
}

The above code works fine for doc,xls,ppt,txt files but it currupts .xlsx,pptx and docx files . When i try to open the file it prompts a repair window saying the file is currupted .. Any idea ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

[浮城] 2024-12-16 04:37:35

我面临同样的问题,但是当我使用大小为 1 的缓冲区(无用)时,问题消失了,我相信添加了一堆额外的字节,并且 Office 套件软件可以检测到这种篡改 =\

I am facing the same problem however when I used a buffer of size 1 (useless) the problem disappeared, I believe there is a bunch of extra bytes added and Office suite software can detect such tampering =\

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文