加密和解密 Office 2007 文档
我正在尝试加密和解密 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我面临同样的问题,但是当我使用大小为 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 =\