C#를 사용 하 여 파일의 암호를 해독 하 고 암호화 하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 307010 - 이 문서가 적용되는 제품 보기.
이 문서의 Microsoft Visual Basic.NET 버전을 참조 하십시오. 301070.
이 문서는 다음 Microsoft.NET Framework 클래스 라이브러리 네임 스페이스를 참조합니다.
  • System.IO
  • System.Security
  • System.Security.Cryptography
참고 이 문서는 Microsoft.NET Framework 2.0에는 적용 되지 않습니다.
모두 확대 | 모두 축소

이 페이지에서

요약

Microsoft.NET Framework 암호화 하는 텍스트 파일을 읽을 수 없는 상태로 하 고 해독 하려면 해당 텍스트 파일을 다시 원래 형식으로 제공 되는 암호화 클래스를 사용 하는 방법을 설명 합니다.

요구 사항

다음은 권장된 하드웨어, 소프트웨어, 네트워크 인프라 및 필요한 서비스 팩입니다.
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 고급 서버, Windows NT 4.0 Server 또는 Microsoft Windows XPProfessional
  • Microsoft Visual Studio 2005 또는 Microsoft Visual Studio.NET

암호화 및 암호 해독

System.Security.Cryptographic 네임 스페이스는 Microsoft.NET Framework는 다양 한 암호화 및 암호 해독을 사용 하 여 수 있도록 도구를 제공 합니다. CryptoStream 클래스는 제공 되는 수많은 클래스 중 하나입니다. 파일 스트림 해독 또는 암호화 하는 CryptoStream 클래스 설계 되었습니다.

파일 암호화

파일을 암호화 하려면 다음과이 같이 하십시오.
  1. Visual Studio 2005 또는 Visual Studio.NET을 시작합니다.
  2. 프로젝트C# 를 클릭 하 고 템플릿에서 콘솔 응용 프로그램을 클릭 합니다. Net C#을 함께 빈 main () 프로시저를 정적 클래스를 만듭니다.
  3. Using 문 (뒤에 나오는 샘플 코드에 표시)으로 thefollowing 네임 스페이스에 사용.
    • 시스템
    • System.Security
    • System.Security.Cryptography
    • System.Text
    • System.IO
    코드에서 thesenamespaces에서 선언을 한정 있지 않습니다. 이러한 모든 otherdeclarations이 문을 사용 해야 합니다.
    using System;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;
    using System.Runtime.InteropServices;
    using System.Text;
    					
  4. 비밀 키를 암호화 하 고 해독할 데이터를 생성 합니다.DESCryptoServiceProvider 대칭 암호화 알고리즘을 기반으로 합니다. Symmetricencryption는 키와 초기화 벡터 (IV) 데이터를 암호화할 수 있어야 합니다. 데이터를 해독 하려면 키 및 IV 동일한 있어야 합니다. 동일한 암호화 알고리즘을 사용 하는 mustalso 있습니다. Usingeither 다음 방법 중에서 키를 생성할 수 있습니다.
    • 방법 1 사용자는 암호를 입력할 수 있습니다. 암호 키 및 IV를 사용 하 여.
    • 방법 2 대칭 암호화 클래스의 새 인스턴스를 만들 때 새 키와 IV는 세션에 대해 자동으로 생성 됩니다. 키 및 IV는 관리 되는 대칭 암호화 클래스 암호화 하 고 해독 된 파일에 의해 생성 된 사용 합니다.

      생성 하 고 키를 배포 하는 방법에 대 한 자세한 내용은 Microsoft.NET Framework SDK 설명서를 참조 하거나 다음 Microsoft Developer Network (MSDN) 웹 사이트를 참조 하십시오.
      암호화 및 암호 해독 키를 생성합니다.
  5. Asession (방법 2 4 단계에 설명 되어 있음)에 따라 새 키를 생성 하려면 다음 함수를 추가 합니다.
    //  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. EncryptFile라는 클래스에 메서드를 만듭니다. EncryptFile 클래스에 다음 세 개의 매개 변수가 있어야 합니다.
    • sInputFilename
    • sOutputFilename
    • sKey (비밀 키를 암호화 하 고 파일을 해독 하는 데 사용 됩니다.)
    static void EncryptFile(string sInputFilename,
    		string sOutputFilename,
    		string sKey)
    					
  7. FileStream 개체 입력된 및 출력 만듭니다 EncryptFile 절차에서 FileStream 개체입니다. 이러한 개체에서 읽고 수는 targetfiles에 기록 합니다.
    FileStream fsInput = new FileStream(sInputFilename, 
    				FileMode.Open, 
    				FileAccess.Read);
    
    FileStream fsEncrypted = new FileStream(sOutputFilename, 
    				FileMode.Create, 
    				FileAccess.Write);
    					
  8. DESCryptoServiceProvider 클래스의 인스턴스를 선언 합니다. 실제 암호화 하 고 파일에 사용 되는 actualdecryption 기술을 나타냅니다. 이 시점에서 다른 cryptographictechnique 또는 RSAsecutiry를 사용 하 여 원하는 경우 다른 공급자를 만듭니다 수 있습니다.
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    					
  9. 암호화 공급자는 yoursecret 키를 사용 하 여 바이트 배열로 서 제공 되어야 합니다. System.Text 네임 스페이스는 GetBytes()라는 함수를 제공 합니다. 인코딩 기능 중 일부로 GetBytes() 함수는 문자열을 바이트 배열로 반환 합니다. Thesize 키를 암호화 기술을 각각 다릅니다. 예를 들어, 데이터 암호화 표준 (DES) 8 바이트 셀이나현재 8 자가 하는 64 비트 키를 사용 합니다.

    경우 하나 공급자 randomlygenerates 키를 제공 하지 않습니다. 성공적으로 파일을 암호화 하지만 없습니다 방법은 todecrypt 파일이 있습니다. 참고 초기화 vector(IV)도 제공 해야 합니다. 이 값은 암호화의 일부로 사용 됩니다. 같은 키를 생성 하는 값을 제공 하지 않는 경우 IV israndomly. 값 bethe 해야 하기 때문에 암호화 및 해독에 동일한을 하지 허용 해야 randomgeneration 값입니다.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    					
  10. Encryptingobject (CreateEncryptor)를 구하는 암호화 공급자를 사용 하 여 CryptoStream 클래스의 인스턴스를 만들고 및 FileStream 개체 생성자의 일부로 출력 기존.
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
    					desencrypt, 
    					CryptoStreamMode.Write);
    					
  11. 입력된 파일에서 읽고 해당 출력 파일을 작성 합니다. 통과 CryptoStream 개체 키를 사용 하 여 파일이 암호화 되어 있는 해당 youprovided.
    byte[] bytearrayinput = new byte[fsInput.Length - 1];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    					

파일을 해독 합니다.

파일의 암호를 해독 하려면 다음과이 같이 하십시오.
  1. 메서드를 만들고 이름을 지정 합니다DecryptFile. 그러나 암호 해독 프로세스 theencryption 프로세스와 비슷합니다, 그리고 DecryptFile 프로시저는 EncryptFile 절차에서 두 가지 주요 차이점이 있습니다.
    • CreateDecryptor 개체의 사용 방법을 지정 하는 CryptoStream 개체를 만들려면 CreateEncryptor 대신 사용 됩니다.
    • 해독된 된 텍스트를 대상 파일에 쓸 때 CryptoStream 개체는 대상 스트림이 아닌 원본 되었습니다.
    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. EncryptFileDecryptFile모두 호출할 main () 프로시저에 다음 줄을 추가 합니다.
    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. 파일을 저장 합니다. 응용 프로그램을 실행 합니다. 입력된 파일 이름 점수는 existingfile 사용 하는 해당 thepath 있는지 확인 하십시오.

프로시저를 테스트 합니다.

코드 암호화 하 고 파일을 올바르게 해독할 것인지 텍스트 (.txt) 파일을 사용 하 여이 코드를 테스트 합니다. 원본 파일 대신 파일을 새 파일 (예:이 문서에 대 한 main ( 프로시저)를) 해독 해야 합니다. 해독 된 파일을 검사 하 고 원본 파일을 비교 합니다.

전체 코드 목록

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

참조

암호화 및.NET의 암호화 기능을 사용 하는 방법에 대 한 자세한 내용은 다음 MSDN 웹 사이트를 참조 하십시오.
System.Security.Cryptography 네임 스페이스
Microsoft.NET Framework 개발자 센터

속성

기술 자료: 307010 - 마지막 검토: 2013년 12월 1일 일요일 - 수정: 3.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
키워드:?
kbsecurity kbio kbcrypt kbhowtomaster kbmt KB307010 KbMtko
기계 번역된 문서
이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.
이 문서의 영문 버전 보기:307010

피드백 보내기

 

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