2012-12-09 39 views
1

我在c#中有一个代码,用于加密和解密.txt文件。但我需要进行加密,并与如PDF,ZIP,JPG等任何扩展解密文件..用c中的单个密钥加密

我搜索蚂蚁试图找到流加密,但我无法找到任何..

我试图从link下面的代码。我改变了文件路径并放置了一些pdf或ppt。它工作正常,但我无法打开解密的文件。

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

namespace CSEncryptDecrypt 
{ 
    class Class1 
    { 
     // Call this function to remove the key from memory after use for security 
     [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")] 
     public static extern bool ZeroMemory(IntPtr Destination, int Length); 

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

     static void EncryptFile(string sInputFilename, 
     string sOutputFilename, 
     string sKey) 
     { 
     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); 
     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.Close(); 
     fsInput.Close(); 
     fsEncrypted.Close(); 
     } 

     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); 
     //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); 
     //Print the contents of the decrypted file. 
     StreamWriter fsDecrypted = new StreamWriter(sOutputFilename); 
     fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd()); 
     fsDecrypted.Flush(); 
     fsDecrypted.Close(); 
     } 

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

     // For additional security Pin the key. 
     GCHandle gch = GCHandle.Alloc(sSecretKey,GCHandleType.Pinned); 

     // Encrypt the file.   
     EncryptFile(@"C:\MyData.txt", 
      @"C:\Encrypted.txt", 
      sSecretKey); 

     // Decrypt the file. 
     DecryptFile(@"C:\Encrypted.txt", 
      @"C:\Decrypted.txt", 
      sSecretKey); 

     // Remove the Key from memory. 
     ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2); 
     gch.Free(); 
     } 
    } 
} 
+0

你是什么意思,“无法打开解密文件”?你是否遇到错误或异常?我没有看到任何内容具体的处理,文件的类型应该不重要。当我尝试加密PDF文件时, –

+0

代码完美工作。它创建加密的pdf文件,并在解密后。当我尝试打开新创建的解密文件时出现错误。 “打开此文档时出错,文件已损坏,无法修复。” – abby

回答

0

感谢您的回复。我找到了原因。我应该使用filestream而不是解密文件中的streamwriter函数

-1

下面的例程我用来安全地序列化对象。 也许它可以帮助你了解流加密是如何工作的:

public bool Save(string filename, object toSerialize) 
    { 

     byte[] SALT = new byte[] 
     {0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c}; 

     string EncryptionKey = "MYPASSWORD"; 

     //basic serialization 
     IFormatter form = new BinaryFormatter(); 
     var stream = new MemoryStream(); 
     form.Serialize(stream, toSerialize); 

     //cryptography preparation 
     var alg = new RijndaelManaged(); 
     var pdb = new Rfc2898DeriveBytes(EncryptionKey, SALT); 
     alg.Key = pdb.GetBytes(32); 
     alg.IV = pdb.GetBytes(16); 

     stream.Position = 0; 
     //cryptorgraphy serialization 
     var encStream = new MemoryStream(); 
     var cryptoStream = new CryptoStream(encStream, alg.CreateEncryptor(), CryptoStreamMode.Write); 
     cryptoStream.Write(stream.ToArray(), 0, (int)stream.Length); 
     cryptoStream.FlushFinalBlock(); 

     var outputFileStream = new FileStream(fileName, FileMode.Create); 
     outputFileStream.Write(encStream.ToArray(), 0, (int)encStream.Length); 
     outputFileStream.Close(); 


     return true; 
    } 

我也可以把你的来源反序列化加密的数据流。

+0

因此,流加密通过向父节点'MemoryStream'写'CryptoStream',然后使用'stream.ToArray()'并将结果字节数组写入另一个流来工作?输入是一个序列化而不是二进制文件的对象? –

+0

是的,上面的例程只是展示了如何使用CryptoStream来保证序列化对象的安全。但是你可以写任何流到cryptoStream。在我的情况下,我正在写串行化对象的流,但你也可以写文件流。 – Vlad