비대칭암호화프로그램.rar
닷넷2005버전에서 제공하는 암호화 관련클래스는 크게 2가지로 나누어 집니다. 첫번째로 비밀키 암호화와 두번째로는 공개키 암호화로 나눌수 있다.
그리고 비밀키 암호화에서는 DES, RC2, Rijndael, TripleDES 알고리즘을 지원하고 있습니다.
그리고 공개키 암호화에서는 DSA와 RSA 알고리즘을 지원하고 있다.
각각의 암호화 알고리즘에 대해서는 설명하지 않겠습니다. 물론 작성하고 있는 저도 알고리즘은 모릅니다.
물론 이 알고리즘 몰라도 프로그래밍하는데 전혀 문제는 없습니다. 알고리즘을 안다고 해서 닷넷에서 제공하는 알고리즘보다 더 좋은 알고리즘을 개발할 필요도 없고 능력도 없습니다. ^^
잡설이 길어 졌네요.
닷넷에서 대칭 즉 비밀키 암호화를 사용하는방법을 알려드리겠습니다.
일반적으로 비밀키 암호화를 간단히 설명하면 일종의 암호를 가지고 메세지를 암호화 하여 이 암호화된 메세지를 암호를 가지고 해독하는 아주 간단한 방법입니다.
물론 이과정에서 여러가지의 수학적인 계산과 여러가지의 연산의 과정을 통해 진행됩니다.
닷넷에서 암호화를 하기위해서는 세 개의 파라미터가 필요한데, 암호화할 문자열과 비밀키(비밀번호), 그리고 초기화 벡터입니다.(initialization vector; IV).
IV는 암호화 과정에서 사용되는 일종의 난수로서 암호화 과정이 완료된 후에 동일한 암호문을 만들어내지 않도록 하기 위함 입니다. 그리고 나중에 복호화할 때 동일한 IV를 필요합니다.
그럼 소스를 가지고 설명하겠습니다
닷넷에서 제공하는 비밀키 암호화 클래스는 모두다 다 같은 방식으로 진행됩니다.
1. 먼저 암호화 할려는 문장설정 Dim OriStr as String="오빠! 사랑해"
2. 평문을 바이트 형태로 저장한다. Dim OriStrByte() as Byte= System.Text.Encoding.Default.GetBytes(OriStr)
3. 메모리 스트림을 생성한다. Dim EncStream As New MemoryStream
4. 암호화 스트림을 생성한다. Dim EncCryptStream As CryptoStream
여기까지는 공통으로 설정하는 부분입니다.
그다음 필요한게 암호화에 사용될 Key와 IV입니다. 이 값은 암호화 알고리즘에 따라 크기가 다 다름니다. DES는 64비트, RC2는 128비트, Rijndael은 256비트, TripleDES은 192비트까지 지원됩니다. 따라서 각 알고리즘에 맞는 키를 생성해야 합니다. 물론 자동적으로 생성되는 GenerateKey,GenerateIV메서드가 있지만 이렇경우 자신만의 암호가 아닌 컴퓨터지맘대로 정한 암호문을 사용하게 됩니다.
키를 설정하는 부분은 제가 올려둔 소스를 보시면 금방 알수 있습니다. 간단한 로직을 설명하면 자신이 입력한 비밀번호를 각각의 단어로 나우어 각나누어진 값의 아스키값을 해슁코드로 매칭시켜서 얻어내는 방법을 구현했습니다.
5. 각각의 암호화 알고리즘에 맞추어 암호화 스트림생성자를 호출한다. 암호화 스트림의 생성자는
Public Sub New (stream As Stream,transform As ICryptoTransform, mode As CryptoStreamMode) 이렇게 구성됩니다. 그리고 각각의 파라미터는 stream 암호화 과정을 수행할 스트림,transform 스트림에 대해 수행될 암호화 변형,mode CryptoStreamMode 값 중 하나입니다. 이렇게 MSDN에 보면 나와있습니다.
이 생성자를 토대로 하면 잘 됩니다. 먼저 Stream은 위에 선언한 메모리스트림을 사용하면됩니다. 현재 이 암호화는 파일을 암호화하는 방식이 아니라 입력한 문자를 암호화시키는 과정입니다. 따라서 메모리스트림을 사용했습니다. 만약 파일을 암호화 한다면 파일 스트림을 사용해야 합니다.
그리고 transform는 암호화 클래스를 통해 수행할 작업을 설정한다고 생각하면 쉽습니다. 즉 Dim TempTran as ICryptoTransform =New DESCryptoServiceProvider().CreateEncryptor(Key, IV) 이런식으로 표현을 한다고 하면 DES암호화 알고리즘을 가지고 암호화 과정을 수행하는 과정입니다. 물론 Key,IV값은 있어야 겠죠. 그리고 CryptoStreamMode에서는 두가지의 값이 있는데 Write와 Read입니다. 전자는 암호화할때 후자는 복호화 할때 입니다.
그럼 전체적으로 암호화 스트림생성자를 통해 작업을 진행하면
'Rijndael암호화 알고리즘을 통해 복호화 과정을 진행한다. DecCryptStream = New CryptoStream(DecStream, New RijndaelManaged().CreateEncryptor(Key, IV), CryptoStreamMode.Write) 'TripleDES암호화 알고리즘을 통해 복호화 과정을 진행한다. DecCryptStream = New CryptoStream(DecStream, New TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV), CryptoStreamMode.Write) 'DES암호화 알고리즘을 통해 복호화 과정을 진행한다. DecCryptStream = New CryptoStream(DecStream, New DESCryptoServiceProvider().CreateEncryptor(Key, IV), CryptoStreamMode.Write)
이렇게 거의 같은 Syntax를 유지하고 있고, 통일성이 있습니다. 자기가 원하는 암호화 알고리즘을 선택해서 사용하면 됩니다.
참고로 RC2는 일부로 안했는데 어떻게 하는건지 알겠죠.
6. 암호화 스트림 메서드를 통해 생성된 데이터 작성
EncCryptStream.Write(ToEncByte, 0, ToEncByte.Length) EncCryptStream.FlushFinalBlock()
7.메모리스트림에 있는 데이터를 바이트 형태로 변환한다 Dim RetByte() As Byte = EncStream.ToArray
8. 스트림을 닫자 EncCryptStream.Close() EncStream.Close()
9. 결과물 확인 바이트형태로 되어 있는 것을 String형태로 바꾼다 Convert.ToBase64String(RetByte)
이렇게 하면 암호화 과정은 끝나게 됩니다.
그다음 복호화 과정은 위 방법과 거의 같습니다. 차이가 있다면 암호화 스트림 생성자에 있는 파라미터중 transform에 있는 작업을 바꾸면 됩니다. 즉 CreateEncryptor(Key, IV)작업을 CreateDecryptor(Key, IV)으로 바꾸면 됩니다. 물론 세부적인 작업과정이 약간 틀려집니다.
1. 암호화된 문장을 바이트 형식으로 바꾼다. 암호화후 암호문은 String형식으로 Convert되었기 때문에 다시 바이트 형식으로 바꿔야 합니다. Dim EncData() As Byte = Convert.FromBase64String(OriStr) 2.메모리 스트림을 생성한다. Dim DecStream As New MemoryStream(EncData) 3. 암호화 스트림 선언한다. Dim DecCryptStream As CryptoStream 4. 각각의 암호화 알고리즘에 맞추어 암호화 스트림생성자를 호출한다. 복호화 과정에서는 아까 설명했듯이 CreateDecryptor메서드를 호출해야 합니다.
'DES암호화 알고리즘을 통해 복호화 과정을 진행한다. DecCryptStream = New CryptoStream(DecStream, New DESCryptoServiceProvider().CreateDecryptor(Key, IV), CryptoStreamMode.Read)
'Rijndael암호화 알고리즘을 통해 복호화 과정을 진행한다. DecCryptStream = New CryptoStream(DecStream, New RijndaelManaged().CreateDecryptor(Key, IV), CryptoStreamMode.Read) 'TripleDES암호화 알고리즘을 통해 복호화 과정을 진행한다. DecCryptStream = New CryptoStream(DecStream, New TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV), CryptoStreamMode.Read)
암호화하는 과정과 거의 같습니다. 물론 여기서 사용되는 Key,IV는 암호화 할때 입력한 비밀번호와 같아야 합니다.
5. 복호화 과정에 필요한 바이트 배열 선언 Dim ToDecByte(EncData.Length) As Byte
6. 복호화 하면서 데이터 쓰기 DecCryptStream.Read(ToDecByte, 0, ToDecByte.Length)
7.복호화된 값 표시 System.Text.Encoding.Default.GetString(ToDecByte)
이렇게 하면 복호화까지 다 되었습니다.
근데 여기서 발생할수 있는 오류가 있는데 먼저 복호화 할때 비밀번호가 틀린경우와 이상한 암호문 을 복호화 할때 생기는 오류가 있는데 이때는 이 구문을 Try구문에 넣고
Catch When Err.Number = 5 MsgBox("비밀번호가 틀려요...!!!!") Catch When Err.Number = 13 MsgBox("올바른 암호문이 아닙니다.")
이렇게 Err Number가지고 오류를 잡을 수 있습니다. 근데 이 구문을 어디다 삽입해야 하는지는 여러분의 숙제....^^
이 상 닷넷에서 제공하는 비밀키 암호화클래스를 통해서 문자열을 암호화하는 과정을 설명했습니다. 암호화는 언젠가 프로젝트 수행히 반드시 한번 만나게 되는 과정입니다. 별로 어럽지 않는 방식이라 자세히 보시면 구문 형태는 아주 간단합니다.
제가 같이 첨부한 이 클래스를 기초로 해서 프로그램을 만들었는데 이 프로그램을 실행시키면서 해보면 잘 알 수 있습니다.
근데 파일제목이 영 반대입니다. 작업중인 프로그램이라서....
다음엔 공개키 암호화와 파일암호화 과정을 진행할께요...언제 될지 모르는데....
닷넷을 공부하는 분들에게 좋은 정보가 되길 바라며... |
첫댓글 Try...***** **** *...Finally 이거군.