2012-12-09 40 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