반응형

 

암호화와 복호화는 꼭 필요한 정보라고 생각한다.

어떤 프로그래밍을 하더라도, 보안을 필수라고 생각하기에...나뿐만 아니라 다른 개발자도 동일한 생각을 가지고 있을 것이다.

암호화 방식도 여러가지로 분류된다. 차근차근 읽어보자.

 

단방향 암호화

One Way 이다. 즉, 암호화는 가능하지만 복호화는 불가능한 알고리즘을 말한다. 이런 알고리즘을 사용하는 것은 패스워드에서 많이 사용된다. 데이터베이스에 암호화된 패스워드를 저장하고, 로그인 시에 사용자가 입력한 패스워드를 암호화하여 데이터베이스에 저장되어있는 암호화 값과 비교하면 된다.

종류도, MD5/SHA1/SHA2 정도 있으니 참고하자.

 

양방향 암호화

Two Way 이다. 단방향 암호화와 다르게, 복호화까지 가능한 알고리즘을 말한다. 여기서 대칭키(비밀키)/비댕치키(공개키)로 나뉘어 지는데, 상세한 것은 생략한다.

나는 여기서 대칭키 중 하나인 DES를 이용하여 간단한 클래스 만들어 보았다.

DES를 이용하여, 암호화/복호화 한방 Class 예제

암호화/복호화를 한방에 처리해주는 메서드를 만들어 주기 위해서, 암호화/복호화의 구분을 하기 위한 enum을 만들었다.

1
2
3
4
public enum DesType {
    Encrypt = 0,    // 암호화
    Decrypt = 1     // 복호화
}
cs

 

DES 클래스를 만들어주었다.

아래 주석에도 되어있지만, Key값은 8자리로 맞춰주어야 한다.

Key값이 8자리가 아니면, Specified key is not a valid size for this algorithm 와 같은 에러가 발생하니 명심하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class DES {
        
    // Key 값은 무조건 8자리여야한다.
    private byte[] Key { get; set; }
 
    // 암호화/복호화 메서드
    public string result(DesType type, string input) {
        var des = new DESCryptoServiceProvider() { 
            Key = Key,
            IV = Key
        };
 
        var ms = new MemoryStream();
 
        // 익명 타입으로 transform / data 정의
        var property = new {
            transform = type.Equals(DesType.Encrypt) ? des.CreateEncryptor() : des.CreateDecryptor(),
            data = type.Equals(DesType.Encrypt) ?  Encoding.UTF8.GetBytes(input.ToCharArray()) : Convert.FromBase64String(input)
        };
 
        var cryStream = new CryptoStream(ms, property.transform, CryptoStreamMode.Write);
        var data = property.data;
 
        cryStream.Write(data, 0, data.Length);
        cryStream.FlushFinalBlock();
 
        return type.Equals(DesType.Encrypt) ? Convert.ToBase64String(ms.ToArray()) : Encoding.UTF8.GetString(ms.GetBuffer());
    }
 
    // 생성자
    public DES(string key) {
        Key = ASCIIEncoding.ASCII.GetBytes(key);
    }
}
cs

그리고 분기처리를 최소화 하기 위해서 익명 타입을 이용해 property 값을 설정해주었다. 익명 타입은 C# 3.0 부터 지원해주었고, 상세한 내용은 아래를 참고하자.

https://im-first-rate.tistory.com/6

 

[C#] 익명 타입(Anonymous Type) 이란?

C# 3.0부터 클래스를 미리 정의하지 않고 사용할 수 있게 하는 익명타입(Anonymous Type)을 지원하게 되었습니다. 익명타입(Anonymous Type)의 특징 읽기전용이다. (get 만 지원한다, set은 안됩니다.) 변수에 할..

im-first-rate.tistory.com

테스트 예제를 만들어봤다. 간단하다. 암호화할 값을 암호화 후 복호화해보는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 지겨운 Hello World로 테스트
var value = "Hello World!";
Console.WriteLine($"테스트 : { value } ");
 
// 다시 한번 8자리 지키자.
var des = new DES("myung123");
 
// 암호화
var encrypt = des.result(DesType.Encrypt, value);
Console.WriteLine($"암호화 : { encrypt } ");
 
// 복호화
var decrypt = des.result(DesType.Decrypt, encrypt);
Console.WriteLine($"복호화 : { decrypt } ");
cs

결과는 우리가 원하는 대로 나왔다. 예외처리도 해야할 필요가 있다면 try/catch 문을 이용해서 더 추가해보도록 하자. (나는 간단하게 테스트를 원했을뿐...)

 

반응형

+ Recent posts