Makale numarası: 307010 - Son Gözden Geçirme: 27 Aralık 2006 Çarşamba - Gözden geçirme: 7.5

Şifrelemek ve Visual C# kullanarak, bir dosyanın şifresini çözme

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Bu makalenin Microsoft Visual Basic .NET sürümü için bkz: 301070  (http://support.microsoft.com/kb/301070/ ) .
Bu makalede, aşağıdaki Microsoft .NET Framework Sınıf Kitaplığı ad alanlarına başvurulmaktadır:
  • System.ıo
  • System.Security
  • System.Security.Cryptography
Not Bu makalede, Microsoft .NET Framework 2.0 için geçerli değildir.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu makalede, şifrelemek için Microsoft .NET Framework bir metin dosyası, okunamayan bir durumu ve sonra şifresini çözmek için bu metin dosyasının yeniden özgün biçimine sağlanır şifreleme sınıflar kullanmayı açıklamaktadır.

Gereksinimler

Aşağıdaki listede önerilen donanım, yazılım, ağ altyapısı ve gereken hizmet paketleri önerilmektedir:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Server, Windows NT 4.0 Server veya Microsoft Windows XP Professional Gelişmiş...
  • Microsoft Visual Studio 2005 veya Microsoft Visual Studio .NET

Şifreleme ve şifre çözme

Microsoft .NET Framework System.Security.Cryptographic ad çeşitli şifreleme ve şifre çözme yardımcı olacak araçlar sağlar. CryptoStream sağlanan birçok sınıflarının bir sınıftır. CryptoStream sınıfı şifrelemek veya onu dışında bir dosyaya akışa gibi içeriğin şifresini çözmek için tasarlanmıştır.

Bir dosyayı şifrele

Bir dosyayı şifrelemek için <a0></a0>, aşağıdaki adımları izleyin:
  1. Visual Studio 2005 veya Visual Studio .NET'i başlatın.
  2. Visual C#Projects altında tıklatın ve şablonları altında Console Application ' ı tıklatın. Visual C# .NET statik bir sınıfı, bir boş Main() yordamı birlikte oluşturur.
  3. Kullanarak (aşağıdaki örnek kodda gösterildiği gibi) aşağıdaki ad alanları kullanmak:
    • Sistem
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.ıo
    Bu ad boşluklarında kodunuzu daha sonra gelen bildirimleri nitelemek sahip olacak biçimde. Bu ifadeler herhangi diğer bildirimler.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
    önce kullanmalısınız.
  4. Şifrelemek ve verilerin şifresini çözmek için bir gizli anahtar oluşturur. DESCryptoServiceProvider bir simetrik şifreleme algoritmasına temel alır. Simetrik şifreleme bir başlatma vektörü (IV) verileri şifrelemek için bir anahtar gerektirir. Verilerin şifresini çözmek için <a0></a0>, aynı anahtarı ve aynı IV olmalıdır. Ayrıca, aynı şifreleme algoritmasını kullanmanız gerekir. Anahtarlar, aşağıdaki yöntemlerden birini kullanarak oluşturabilirsiniz:
    • Yöntem 1 Kullanıcı için parola isteyebilir. Daha sonra parola anahtarı ve IV kullanın.
    • Yöntem 2 Simetrik şifreleme sınıflar için yeni bir örneğini oluşturduğunuzda, yeni bir anahtar ve IV oturum için otomatik olarak oluşturulur. Yönetilen simetrik şifreleme sınıfları tarafından şifrelemek ve dosyanın şifresini çözmek için oluşturulan IV ve anahtarı'nı kullanın.

      Oluşturmak ve anahtarları dağıtma hakkında daha fazla bilgi için Microsoft .NET Framework SDK belgelerine bakın veya aşağıdaki Microsoft Developer Network (MSDN) Web sitesine bakın:
      Şifreleme ve şifre çözme anahtarlarını oluşturma
      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcongeneratingkeysforencryptiondecryption.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcongeneratingkeysforencryptiondecryption.asp)
  5. (Adım 4 ', yöntem 2'de belirtildiği gibi) bir oturum için yeni bir anahtar oluşturmak için aşağıdaki işlevi ekler:
    //  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(ref string 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);
    }
  6. Bir yöntem EncryptFile adlı sınıfınızda oluşturun. EncryptFile sınıfı, aşağıdaki üç parametre olmalıdır:
    • sInputFilename
    • sOutputFilename
    • sKey (Şifrelemek veya dosyanın şifresini çözmek için kullanılan gizli anahtarı.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. Bir giriş FileStream nesnesi ve bir çıkış EncryptFile yordamı oluşturmak FileStream nesne. Bu nesneleri okuyabilir ve olması yazılan hedef dosyaların.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. DESCryptoServiceProvider</a0> sınıfının bir örneği bildirin. Gerçek şifreleme ve dosyalar üzerinde kullanılan gerçek şifre çözme teknolojisi temsil eder. RSAsecutiry veya başka bir şifreleme tekniği. kullanmak isterseniz bu noktada, farklı bir sağlayıcı oluşturabileceğiniz
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. Şifreleme sağlayıcısı gizli anahtarınızla bayt dizisi sağlanması gerekir. System.Text ad GetBytes() adlı bir işlev sağlar. Kodlama özellikleri parçası GetBytes() işlev bir dize al?r ve bir bayt dizisi verir. Anahtar boyutu için her bir şifreleme tekniği farklıdır. Örneğin, Veri Şifreleme Standardı (DES) eşittir 8 bayt veya 8 karakter 64 bitlik bir anahtar kullanır.

    Bir anahtar belirtmezseniz, sağlayıcı rasgele bir oluşturur. Bu dosya başarıyla şifreler, ancak dosyanın şifresini çözmek için bir yolu yoktur. Başlatma vektörü de sağlaması gerekir unutmayın (IV). Bu değer, şifreleme bir parçası olarak kullanılır. Değer girmezseniz anahtarının IV rasgele oluşturulur. Değerleri şifrelemesini ve şifre çözme için aynı olması gerektiğinden, rasgele nesil bu değerleri. izin gerekir
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Bir şifreleme nesnesi (CreateEncryptor) elde etmek için şifreleme sağlayıcısı kullanarak CryptoStream</a0> sınıfının bir örneği oluşturmak ve varolan FileStream nesneyi kurucu.'ün bir parçası olarak çıktı
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Girdi dosyasında okuma ve çıkış dosyasına yazma. Burada dosya, sağladığınız anahtarı kullanılarak şifrelenir CryptoStream nesnesi üzerinden geçmesine.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

Bir dosyanın şifresini çözme

Bir dosyanın şifresini çözmek için aşağıdaki adımları izleyin:
  1. Bir yöntem oluşturmak ve bu DecryptFile yeniden adlandırın. Şifre çözme işlemi için şifreleme işlemini benzer, ancak DecryptFile yordamı EncryptFile yordamdan iki anahtar fark.
    • CreateDecryptorCreateEncryptor yerine nesnenin nasıl kullanılacağını belirten bir CryptoStream nesnesi oluşturmak için kullanılır.
    • Hedef dosyanın şifresi çözülmüş metin yazıldığında, CryptoStream artık kaynak hedef akış yerine nesnedir.
    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();
    }
    					
  2. Main() yordamına EncryptFile hem DecryptFile aramak için aşağıdaki satırları ekleyin:
    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();
    }
  3. Dosyayı kaydedin. Uygulamanızın çalıştırın. Girdi dosyası adı için kullanılan yol, varolan bir dosyaya işaret ettiğinden emin olun.

Yordamı sınayın.

Bu kod, kod, şifrelenmiş ve doğru olarak dosyanın şifresi onaylamak için bir metin (.txt) dosyası sınayın. Yeni bir dosyaya (gibi bu makaledeki Main() yordam) dosyası yerine özgün dosyanın şifresini olduğunu emin olun. Şifresi çözülmüş dosyasını inceleyin ve sonra özgün dosyaya yeniden karşılaştırın.

Tam kod listesi

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

Referanslar

Şifreleme ve. NET'in şifreleme özelliklerini kullanma hakkında daha fazla bilgi için aşağıdaki MSDN Web sitelerine bakın:
System.Security.Cryptography ad
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecuritycryptography.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecuritycryptography.asp)
Microsoft .NET Framework Geliştirici Merkezi
http://msdn2.microsoft.com/en-us/netframework/default.aspx (http://msdn2.microsoft.com/en-us/netframework/default.aspx)
Visual C# .NET hakkında daha fazla genel bilgi için aşağıdaki Usenet haber grubuna bakın:
microsoft.public.dotnet.languages.csharp (http://go.microsoft.com/fwlink/?linkid=5217)

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Anahtar Kelimeler: 
kbmt kbsecurity kbio kbcrypt kbhowtomaster KB307010 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:307010  (http://support.microsoft.com/kb/307010/en-us/ )