Nasıl şifrelenir ve Visual C# kullanarak bir dosyanın şifresini çözme

Makale çevirileri Makale çevirileri
Makale numarası: 307010 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makalenin Microsoft Visual Basic .NET sürümü için bkz: 301070.
Bu makalede, aşağıdaki Microsoft .NET için denilmektedir. Framework sınıf kitaplığı ad:
  • System.IO
  • System.Security
  • System.Security.Cryptography
Not Bu makalede, Microsoft .NET Framework 2.0 için geçerli değildir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bu makalede şifreleme sınıflarının nasıl kullanılacağını açıklar. bir metin dosyasını şifrelemek için Microsoft .NET Framework tarafından sağlanan bir okunamaz durumu ve sonra yeniden özgün metin dosya şifresini çözmek için biçimi.

Gereksinimleri

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

Şifreleme ve şifre çözme

System.Security.Cryptographic isim uzayı Microsoft .NET Framework içinde çeşitli sağlar. şifreleme ve şifre çözme ile yardımcı olan araçlar. CryptoStream sınıfı, sağlanan birçok sınıf biridir. CryptoStream sınıfı, şifrelemek için veya olduğu gibi içeriğin şifresini çözmek için tasarlanmıştır. çıkışı bir dosyaya akış.

Bir dosyayı şifreleme

Bir dosyayı şifrelemek için şu adımları izleyin:
  1. Visual Studio 2005 veya Visual Studio .NET başlatın.
  2. ' I tıklatın Visual C# altındaProjelerve ardından Konsol uygulamasıaltında Şablonları. Visual C# .NET Static bir s?n?f?n bir boş Main() yordamı ile birlikte sizin için oluşturur.
  3. (Aşağıdaki örnek kodda gösterildiği gibi) üzerinde kullanarak deyimi kullanın Aşağıdaki ad alanları:
    • Sistem
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    Böylece bu bildirimleri niteleme gerekmez Kodunuzu daha sonra ad. Bu ifadeler diğer önce kullanmalısınız. bildirimleri.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. Şifrelemek ve verilerin şifresini çözmek için gizli bir anahtar oluşturur. DESCryptoServiceProvider bir simetrik şifreleme algoritmasına dayanır. Simetrik bir anahtar ve bir başlatma vektörü (IV) şifrelemek için şifreleme gerekiyor veri. Verilerin şifresini çözmek için aynı anahtarı ve aynı IV olması gerekir. Yapmanız gerekenler Ayrıca aynı şifreleme algoritması kullanır. Anahtarları kullanarak oluşturur Aşağıdaki yöntemlerden herhangi birini:
    • Yöntem 1 Kullanıcı için bir parola girmesini isteyebilirsiniz. Daha sonra parola olarak kullanın anahtar ve IV.
    • Yöntem 2 Yeni bir örneğini simetrik şifreleme oluşturduğunuzda sınıflar, yeni bir anahtar ve IV oturum için otomatik olarak oluşturulur. Kullanım Yönetilen simetrik şifreleme sınıfları tarafından oluşturulan anahtar ve IV şifrelemek ve dosyanın şifresini çözmek için.

      Nasıl yapıldığı hakkında daha fazla bilgi için ve anahtarları dağıtma, bkz: Microsoft .NET Framework sdk oluşturur. Belgelerine bakın veya aşağıdaki Microsoft Developer Network (msdn) Web Bkz: Site:
      Şifreleme ve şifre çözme anahtarlarını oluşturma
  5. Eklemek için yeni bir anahtar oluşturmak için aşağıdaki işlev bir oturum (adım 4 yöntem 2'de belirtildiği gibi):
    //  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. Sınıfınız içinde EncryptFileadında bir yöntem oluşturun. EncryptFile sınıfı, aşağıdaki üç parametre olması gerekir:
    • sInputFilename
    • sOutputFilename
    • sKey (Gizli anahtar şifrelemek ve şifresini çözmek için kullanılır dosya.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. EncryptFile yordamında bir giriş FileStream nesnesi ve bir çıktı oluşturmak FileStream nesne. Bu nesneler okuma ve hedef için yazılmış $$$$
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. DESCryptoServiceProvider sınıfı örneğini bildirir. Bu gerçek şifreleme ve gerçek temsil eder dosyalar üzerinde kullanılan şifre çözme teknolojisi. Bu noktada, oluşturma RSAsecutiry veya başka bir şifreleme kullanmak isterseniz farklı bir sağlayıcı Teknik.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. Şifreleme Sağlayıcısı ile sağlanması gerekir, bir bayt dizisi olarak gizli anahtar. System.Text ad alanı GetBytes()adında bir işlev sağlar. Kodlama özellikleri bir parçası olarak GetBytes() işlev bir dize alır ve bir bayt dizisi verir. , anahtar boyutu her şifreleme tekniği için farklıdır. Örneğin, Veri Şifreleme Standardı (des) için 8 bayt eşit olan 64 bitlik bir anahtar alır veya 8 karakter için.

    Sağlayıcı anahtarı rasgele belirtmezseniz birini oluşturur. Bu dosyayı başarıyla şifreler, ancak için bir yol yoktur Dosya şifresini çözme. Not başlatma vektörü de sağlaması gerekir (IV). şifreleme bir parçası olarak bu değer kullanılır. Anahtarı gibi IV. değer belirtmezseniz, rasgele oluşturulur. Değerler gerektiğinden değil aynı şifreleme ve şifre çözme için izin vermeniz gerekiyorsa rasgele Bu değerler oluşturma.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Bir şifreleme elde etmek için şifreleme sağlayıcısı kullanarak CryptoStream sınıfının bir örneğini oluşturun. nesne (CreateEncryptor) ve varolan FileStream nesnesinin yapıcısının bir parçası olarak çıktı.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. Girdi dosyasında okuma ve daha sonra çıktıyı yazamadı dosya. CryptoStream nesnesi üzerinden nerede dosyası anahtarı kullanılarak şifrelenir, geçirdiğiniz sağlanan.
    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şturun ve adlandırınDecryptFile. Şifre çözme işlemi benzer şifreleme işlemi, ancak DecryptFile yordam EncryptFile yordamdan iki önemli fark vardır.
    • CreateDecryptorCreateEncryptor nesnenin nasıl kullanılabileceğini belirten CryptoStream nesnesi oluşturmak için kullanılır.
    • Şifresi çözülmüş metin hedefe ne zaman yazılır CryptoStream nesnesi artık hedef yerine kaynak dosyasıdır Akış.
    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. Hem EncryptFile hem de DecryptFileçağırmak için Main() yordamı 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ı çalıştırabilirler. Emin olun Varolan bir girdi dosyası adı noktaları için kullanılan yolu dosya.

Yordamı sınamak

Bu kod, onaylamak için bir metin (.txt) dosyası kodu test şifrelenir ve doğru dosya şifresi çözülür. Dosya şifresini çözme emin olun Yeni bir dosyaya yerine (Bu makaledeki Main() yordam) olduğu gibi özgün dosyaya. Şifresi çözülen dosya inceleyin ve sonra özgün dosyaya 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 kullanma hakkında daha fazla bilgi için Şifreleme özellikleri, .NET, aşağıdaki msdn Web sitelerine bakın:
System.Security.Cryptography ad alanı
Microsoft .NET Framework Geliştirici Merkezi

Özellikler

Makale numarası: 307010 - Last Review: 27 Aralık 2012 Perşembe - Gözden geçirme: 3.0
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: 
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMttr
Machine-translated Article
Ö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

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com