728x90
300x250

[C#.NET] AES를 통한 파일 암호화 구현 예제

 

AES를 통한 파일을 암호화하는 방법에 관해 논해보겠습니다.

C#을 통해 파일을 암호화하는 방법입니다.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;

using System.Security; 

using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        // Rfc2898DeriveBytes constants:
        public readonly byte[] salt = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

      // Must be at least eight bytes.  MAKE THIS SALTIER!
      public const int iterations = 1042; // Recommendation is >= 1000.


        public static void Main(string[] args)
        {

 

        }

 

복호화(Encrypt)

 

public static void EncryptFile(string inputFile, string outputFile)
{

     try
     {
         string password = @"myKey123"; // Your Key Here
         UnicodeEncoding UE = new UnicodeEncoding();
         byte[] key = UE.GetBytes(password);

         string cryptFile = outputFile;
         FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);

         RijndaelManaged RMCrypto = new RijndaelManaged();

         CryptoStream cs = new CryptoStream(fsCrypt,
         RMCrypto.CreateEncryptor(key, key),
         CryptoStreamMode.Write);

         FileStream fsIn = new FileStream(inputFile, FileMode.Open);

         int data;
         while ((data = fsIn.ReadByte()) != -1)
              cs.WriteByte((byte)data);


              fsIn.Close();
              cs.Close();
              fsCrypt.Close();
        }
     catch
     {

     }
}

 

부호화(Decrypt)

 

/// Decrypts a file using Rijndael algorithm.
///</summary>
///<param name="inputFile"></param>
///<param name="outputFile"></param>
public static void DecryptFile(string inputFile, string outputFile)
{

    {
        string password = @"myKey123"; // Your Key Here

        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] key = UE.GetBytes(password);

        FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);

        RijndaelManaged RMCrypto = new RijndaelManaged();

        CryptoStream cs = new CryptoStream(fsCrypt,
        RMCrypto.CreateDecryptor(key, key),
        CryptoStreamMode.Read);

        FileStream fsOut = new FileStream(outputFile, FileMode.Create);

    

        int data;
        while ((data = cs.ReadByte()) != -1)
             fsOut.WriteByte((byte)data);

             fsOut.Close();
             cs.Close();
             fsCrypt.Close();

        }
}

반응형
728x90
300x250

[ASP.NET] 내장 암호화(HashPasswordForStoringInConfigFile) 기법 사용하기 - 복호화(X)

내장 암호화 전 게시물에 이어 이번에는 복호화(Decrypt)가 불가능한 기법에 대해 소개하겠습니다.
라이브러리의 물리 경로는 System.Web.Security.FormsAuthenication.HashPasswordForStoringInConfigFile에 있습니다.
이 라이브러리의 형식은 다음과 같습니다.

public static string HashPasswordForStoringInConfigFile(string password, string passwordFormat)



1. string password 세부항목

string password는 부호화시킬 대상의 암호를 문자열로 입력하면 됩니다.
string passwordFormat은 System.Web.Configuration.FormsAuthPasswordFormat 열거형 값 중 하나를 나타내는 String입니다.

참고1) System.Web.Configuration.FormsAuthPasswordFormat 열거형 값

string password는 부호화시킬 대상의 암호를 문자열로 입력하면 됩니다.
string passwordFormat은 System.Web.Configuration.FormsAuthPasswordFormat 열거형 값 중 하나를 나타내는 String입니다.


2. string passwordFormat 세부항목

 
                           표2-1. System.Web.Configuration.FormsAuthPasswordFormat 열거형 값

 번호

 종류

 비고 

 1

 Clear

 암호화 시키지 않습니다.

 2

 MD5

 암호화

 3

 SHA1

 암호화


3. MD5와 SHA1(읽어보기)


                                     표2-2. MD5와 SHA1의 특징 및 문제점 그리고 현재는?


MD5(Message-Digest algorithm 5)
는 128비트 암호화 해시 함수이다. RFC 1321로 지정되어 있으며, 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용됩니다. 1991년에 로널드 라이베스트가 예전에 쓰이던 MD4를 대체하기 위해 고안했습니다.

1996년에 MD5의 설계상 결함이 발견되었습니다. 이것은 매우 치명적인 결함은 아니었지만, 암호학자들은 해시 용도로 SHA-1와 같이 다른 안전한 알고리즘을 사용할 것을 권장하기 시작했습니다. 2004년에는 더욱 심한 암호화 결함[1]이 발견되었고. 2006년에는 노트북 컴퓨터 한 대의 계산 능력으로 1분 내에 해시 충돌을 찾을 정도로 빠른 알고리즘이 발표[2]되기도 하였습니다. 현재 MD5 알고리즘을 보안 관련 용도로 쓰는 것은 권장하지 않으며, 심각한 보안 문제를 야기할 수도 있습니다. 2008년 12월에는 MD5의 결함을 이용해 SSL 인증서를 변조하는 것이 가능하다는 것이 발표되기도 했습니다.

 


SHA(Secure Hash Algorithm, 안전한 해쉬 알고리즘) 함수들은 서로 관련된 암호학적 해쉬 함수들의 모음입니다. 이들 함수는 미국 국가 안전 보장국(NSA)이 1993년에 처음으로 설계했으며 미국 국가 표준으로 지정되었습니다. SHA 함수군에 속하는 최초의 함수는 공식적으로 SHA라고 불리지만, 나중에 설계된 함수들과 구별하기 위하여 SHA-0이라고도 불립니다. 2년 후 SHA-0의 변형인 SHA-1이 발표되었으며, 그 후에 4종류의 변형, 즉 SHA-224, SHA-256, SHA-384, SHA-512가 더 발표되었습니다. 이들을 통칭해서 SHA-2라고 하기도 합니다.

SHA-1은 SHA 함수들 중 가장 많이 쓰이며, TLS, SSL, PGP, SSH, IPSec 등 많은 보안 프로토콜과 프로그램에서 사용되고 있다. SHA-1은 이전에 널리 사용되던 MD5를 대신해서 쓰이기도 합니다. 혹자는 좀 더 중요한 기술에는 SHA-256이나 그 이상의 알고리즘을 사용할 것을 권장합니다.

SHA-0과 SHA-1에 대한 공격은 이미 발견되었습니다. SHA-2에 대한 공격은 아직 발견되지 않았으나, 전문가들은 SHA-2 함수들이 SHA-1과 비슷한 방법을 사용하기 때문에 공격이 발견될 가능성이 있다고 지적합니다. 이들은 이제 새로운 해쉬 함수 표준을 위해 후보 함수들을 개발하고 있습니다.

 


4. 출력물

이 결과를 토대로 볼 때 그래도 MD-5보다는 SHA1이 낫다는 것을 확인할 수 있습니다.
라이브러리를 사용하면 구현하기 쉽습니다. 물론 라이브러리를 직접 구현한다면 매우 복잡하고 어렵습니다.
이번 실습에서는 아래와 같은 화면을 구현하여 암호 알고리즘을 적용하는 방법을 설명하겠습니다.



1. 새 프로젝트 만들기



ASP 빈 프로젝트를 만듭니다.

2. 빈 항목 추가하기(ASPX)



적당히 설정 후 추가 버튼을 누릅니다.

3. Label 만들기



도구 모음에서 Label을 하나 선택하여 만듭니다.

3. 코딩

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           
            string sField = "1";
            Label1.Text = FormsAuthentication.HashPasswordForStoringInConfigFile(sField, "SHA1");

        }
    }
}



5. 참고자료(Reference)

1. http://ko.wikipedia.org/wiki/MD5, Accessed by 2011-01-23
2. http://ko.wikipedia.org/wiki/SHA, Accessed by 2011-01-23

반응형
728x90
300x250

[ASP.NET] 내장 암호화(FormsAuthenticationTicket) 기법 사용하기 - 복/부호화 (O)

.NET Framework에 탑재된 System.Web.Security의 라이브러리를 사용하여 암호화하는 방법을 소개하겠습니다. 이번에 소개할 암호화 기법은 폼 인증에 이용되는 FormsAuthenticationTicket을 이용하는 방법에 대해서 설명하겠습니다.
이 암호화 기법의 특징은 대략 암호화가 이루어지면 길이가 300~400문자 이내로 구성됩니다. 쿠키에 적용하여 사용하면 많은 도움을 얻게 될 것입니다.

이번 실습 강좌에서는 아래에 출력된 화면과 같이 복호화와 부호화 처리를 구현하는 방법을 소개하겠습니다.


1. ASP.NET으로 암호화 구현하기(FormsAuthenticationTicket)

 

그림 1-1. 완성된 프로그램

1-1. ASP.NET 빈 프로젝트 만들기



새 프로젝트 만들기에서 ASP.NET 빈 웹 응용프로그램 만들기를 선택한 후에 적절한 설정을 맞추고 확인을 클릭합니다.

1-2. 빈 항목 추가하기(ASPX 페이지)



aspx 페이지를 적당히 설정 후에 추가를 누릅니다.

1-3. 도구 상자에서 Label 만들기



파란색으로 점 찍어놓은 Label 버튼을 클릭하여 디자인 창에 2개를 만들어줍니다.
그렇게 되면 Label1, Label2가 생성된 것을 보실 수 있습니다.

1-4. 코딩하기



디자인 창에서 빈 바탕에 더블클릭 하시면 Page_Load라는 Void 형식의 객체가 만들어집니다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
          string sField = "1";
        Label1.Text = FormsAuthentication.Encrypt(new FormsAuthenticationTicket(sField, true, 1));

        FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(Label1.Text);

        Label2.Text = Ticket.Name;

        }
    }
}

반응형

+ Recent posts